Java8Optional判空详解(简化判空操作)
⼀、导语
在没有⽤Optional判空之前,你是否也像下⾯的代码⼀样判空呢?如果是,请往下看,Optional 相对传统判空的优势。
传统阶层判空
为什么要⽤Optional,它到底是什么东西
你也看到了上⾯的那张图,⼀旦代码量⼤起来了,条件多了,代码就会变得很冗余,变得难以维护。那么此时我们就有必要了解Optional了。
Optional 类是⼀个可以为null的容器对象。如果值存在则isPresent()⽅法会返回true,调⽤get()⽅法会返回该对象。Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有⽤的⽅法,这样我们就不⽤显式进⾏空值检测。Optional 类的引⼊很好的解决空指针异常。
⼆、Optional使⽤
Optional 的⽅法,如下图
Optional⽅法-图1
Optional⽅法-图2
⽅法就是这么多,其他的也不必多说,相信各位⼩伙伴⼀看就懂;如何使⽤,还是⽤代码演⽰,请往下移步。
三、Optional实例
1.of
为⾮null的值创建⼀个Optional。of⽅法通过⼯⼚⽅法创建Optional类。需要注意的是,创建对象时传⼊的参数不能为null。如果传⼊参数为null,则抛出NullPointerException 。
nullpointerexception为什么异常Optional<String> optional = Optional.of("xiaoming");
//传⼊null,抛出NullPointerException
Optional<Object> o = Optional.of(null);
2.ofNullable
为指定的值创建⼀个Optional,如果指定的值为null,则返回⼀个空的Optional。
Optional<Object> o1 = Optional.ofNullable(null);
3.isPresent
值存在返回true,否则返回false
Optional<String> optiona2 = Optional.of("xiaoming");
System.out.println(optiona2.isPresent());
<
Optional有值就返回,没有抛出NoSuchElementException
Optional<Object> o1 = Optional.ofNullable(null);
System.out.());
5.ifPresent
如果Optional有值则调⽤consumer处理,否则不处理
Optional<Object> o1 = Optional.ofNullable(null);
o1.ifPresent(s -> System.out.println(s));
如果有值则将其返回,否则返回指定的其它值
Optional<Object> o1 = Optional.ofNullable(null);
System.out.Else("输出orElse")); // 输出orElse
orElseGet与orElse⽅法类似,区别在于得到的默认值。orElse⽅法将传⼊的字符串作为默认值,orElseGet⽅法可以接受Supplier接⼝的实现⽤来⽣成默认值
Optional<Object> o1 = Optional.ofNullable(null);
System.out.ElseGet(() -> "default value")); // default value
*注意:orElse 和 orElseGet 看似差不多,其实有很⼤不同;看下⾯例⼦
Shop shop = null;
System.out.println("test orElse");
Optional.ofNullable(shop).orElse(createNew());System.out.println("test orElseGet");
Optional.ofNullable(shop).orElseGet(()->createNew());
//createNew
private static Shop createNew() {  System.out.println("create new");
return new Shop("尺⼦", 50);
}//输出:
test orElsecreate newtest orElseGetcreate new
Shop shop = new Shop("钢笔",100);
System.out.println("test orElse");
Optional.ofNullable(shop).orElse(createNew());System.out.println("test orElseGet");
Optional.ofNullable(shop).orElseGet(()->createNew());
//输出
test orElsecreate newtest orElseGet
从上⾯两个例⼦可以看到,当Optional 为空时,orElse和orElseGet 区别不⼤,但当Optional有值时,orElse仍然会去调⽤⽅法创建对象,⽽orElseGet不会再调⽤⽅法;在我们处理的业务数据量⼤的时候,这两者的性能就有很⼤的差异。
如果有值则将其返回,否则抛出supplier接⼝创建的异常。
Optional<Object> o1 = Optional.ofNullable(null);
try {
} catch (Exception e) {
System.out.println("info:" + e.getMessage());
}//输出:info:异常!
9.map
如果有值,则对其执⾏调⽤mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map ⽅法返回值,否则返回空Optional。
Optional<String> optional = Optional.of("xiaoming");
String s = optional.map(e -> e.toUpperCase()).orElse("shiyilingfeng");
System.out.println(s); //输出: XIAOMING
10.flatMap
如果有值,为其执⾏mapping函数返回Optional类型返回值,否则返回空Optional。与map不同的是,flatMap 的返回值必须是Optional,⽽map的返回值可以是任意的类型T
Optional<String> optional = Optional.of("xiaoming");
Optional<String> s = optional.flatMap(e -> Optional.UpperCase()));
System.out.()); //输出:XIAOMING
11.filter
List<String> strings = Arrays.asList("rmb", "doller", "ou");
for (String s : strings) {
Optional<String> o = Optional.of(s).filter(s1 -> !s1.contains("o"));
System.out.Else("没有不包含o的"));
}//输出:
rmb
没有不包含o的
没有不包含o的
四、⼩结
Optional 是java⾮常有⽤的⼀个补充,它旨在减少代码中的NullPointerExceptions,虽然不能百分之百的消除,但也是精⼼设计的。使⽤Optional 能更好的帮助我们创建可读性强,bug更少的应⽤程序。
总结
到此这篇关于Java8 Optional判空(简化判空操作)的⽂章就介绍到这了,更多相关Java8 Optional判空内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!