欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

乐字节-Java8新特性之Optional

程序员文章站 2022-03-13 16:57:06
上一篇小乐带大家了解了Java新特性之Stream,接下来将会继续述说Java新特性之Optional Optional类(java.util.Optional)是一个容器类,代表一个值存在或不存在,原来用null表示一个值不存在,现在Optional可以更好的表达这个概念。并且可以避免空指针 ......

 

上一篇小乐带大家了解了java新特性之stream,接下来将会继续述说java新特性之optional

 

optional<t>类(java.util.optional)是一个容器类,代表一个值存在或不存在,原来用null表示一个值不存在,现在optional可以更好的表达这个概念。并且可以避免空指针异常。

1、of

为非null的值创建一个optional,如果值为null,则会抛出nullpointerexception

optional<integer> optional = optional.of(13);
system.out.println(optional)

 

2、ofnullable

为指定的值创建一个optional,如果指定的值为null,则返回一个空的optional。

optional<string> optional2 = optional.ofnullable(null);
system.out.println(optional2);
optional2 = optional.ofnullable("aaa");
system.out.println(optional2);

 

3、ispresent

如果值存在返回true,否则返回false。

optional<string> optional2 = optional.ofnullable(null);
system.out.println(optional2);
system.out.println(optional2.ispresent());

optional2 = optional.ofnullable("aaa");
system.out.println(optional2);
system.out.println(optional2.ispresent());

4、get

如果optional有值则将其返回,否则抛出nosuchelementexception。

optional2 = optional.ofnullable("aaa");
system.out.println(optional2);
system.out.println(optional2.ispresent());
system.out.println(optional2.get());

5、ifpresent  

如果optional实例有值则为其调用consumer,否则不做处理 。隐士地其中进行了null判断。

public static void main(string[] args) {
   string str1 = "hello";
   string str2 = null;
   optional<string> optional1 = optional.ofnullable(str1);
   optional<string> optional2 = optional.ofnullable(str2);

   optional1.ifpresent(str->system.out.println(str.length()));
   optional2.ifpresent(str-> system.out.println(str.length()));
}

 

6、orelse

如果有值则将其返回,否则返回指定的其它值。

public static void main(string[] args) {
   string str1 = "hello";
   string str2 = null;
   optional<string> optional1 = optional.ofnullable(str1);
   optional<string> optional2 = optional.ofnullable(str2);
   system.out.println(optional1.orelse("默认字符串"));
   system.out.println(optional2.orelse("默认字符串"));
}

7、orelseget

orelseget与orelse方法类似,区别在于得到的默认值。orelse方法将传入的一个值作为默认值,orelseget方法可以接受supplier接口的实现用来生成默认值

public static void main(string[] args) {
   integer i = 20;
   optional<integer> op = optional.ofnullable(i);
   system.out.println(op.orelseget(()->0));
   system.out.println(optional.ofnullable(null).orelseget(()->0));
}

 

8、orelsethrow

如果有值则将其返回,否则抛出supplier接口创建的异常。

public static void main(string[] args) {
   // 自己指定异常
   system.out.println((optional.ofnullable("a").orelsethrow(()->new indexoutofboundsexception())));
   system.out.println((optional.ofnullable(null).orelsethrow(()->new indexoutofboundsexception())));
}

 

9、map

map处理有值的情况,如果有值,则对其执行调用map参数中的函数得到返回值,否则返回空optional。

public static void main(string[] args) {
  list<string> list = new arraylist<string>(){
      {
           add("aaa");
           add("bbb");
           add(null);
      }
  };

  list.stream().foreach(temp ->{
       optional<string> opt = optional.ofnullable(temp);
       system.out.println(opt.map(n -> {
          return n.touppercase();
      }).orelse("nothing"));
  });

  // 简写为如下形式
   list.stream().foreach(temp->{
       system.out.println(optional.ofnullable(temp).map(n->n.touppercase()).orelse("nothing"));
  });
}

 

10、flatmap

如果有值,为其执行mapping函数返回optional类型返回值,否则返回空optional。flatmap与map(funtion)方法类似,区别在于flatmap中的mapper返回值必须是optional。调用结束时,flatmap不会对结果用optional封装。 可以将内容

public static void main(string[] args) {
   optional<string> opt1 = optional.ofnullable("aaa");
   optional<string> opt2 = optional.ofnullable(null);
   system.out.println(opt1.flatmap(n->{
       return optional.ofnullable(n.touppercase());
  }).orelse("还会没有吗"));

   system.out.println( opt2.flatmap(n->{
       return optional.ofnullable(n.touppercase());
  }).orelse("还会没有吗"));
}

 

11、filter

如果有值并且满足断言条件返回包含该值的optional,否则返回空optional。

public static void main(string[] args) {
   optional<string> opt1 = optional.ofnullable("aabbbbaa");
   optional<string> opt2 = optional.ofnullable(null);

   system.out.println(opt1.filter(value->value.length()>6));
   system.out.println(opt2.filter(value->value.length()>6));
}

 

好了,java8新特性之optional就介绍到这里了,接下去小乐将会继续带大家了解java8新特性,请继续关注,转载请说明出处和作者。