栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Optional让代码更简单

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Optional让代码更简单

Optional是java8引入的新api。他有效的处理了if对空指针等情况的判断。让代码更简洁。
我们下面主要针对下个这个类进行操作

class Book {
    public String name;

    public String getName() {
 return name;
    }
}
Optional的创建

Optional的创建有3中。这里只说两种。因为另外一种实在没有找到合适的场景

Optional.ofNullable();
Optional.empty()

第一个是接收一个可以为空的值。
第二个是创建一个空的Optional。

针对空指针取默认值

写程序往往是如果对象是null,可能赋值给一个固定值返回。

 Optional userOptional = Optional.ofNullable(book);
 String hello = userOptional.map(Book::getName).orElse("hello");
 System.out.println(hello);

这里主要是创建Optional后,先map获取对象的数据,如果是空就会返回hello。
这个在字段少的时候用处可能不明显。但是在嵌套层次比较多的时候。

 userOptional.map(Book::getName).map().map().orElse("hello");

可以在层层取数据的时候用map或者flatmap获取字段数据。最终写成一行,要比不断的写if判断明显省去了不少代码。

针对空指针抛出异常

我们也遇到一种情况,例如判断为空的时候要抛出自定义异常,中断操作。

 Optional userOptional = Optional.ofNullable(book);
 String error = userOptional.map(Book::getName).orElseThrow(() -> new RuntimeException("name is null"));

过滤出需要的值

如果获取到的值不少null,也有一些匹配的操作在里面,例如找出名字里是张开头的书、

 Optional userOptional = Optional.ofNullable(book);
 String bookName = userOptional.map(Book::getName).filter((name) -> name.contains("张")).get();
 System.out.println(bookName);

使用filter可以帮助我们做值的过滤

如果存在某个值,就做一些操作

我们判断完值的存在可能需要做一些后续的操作,例如出现了有张的书名的书,就执行购买。

 Optional userOptional = Optional.ofNullable(book);
 userOptional.map(Book::getName).filter((name) -> name.contains("张")).ifPresent(name -> System.out.println("购买"+name));

ifPresent后面可以跟一个Consumer,可以帮忙做后面的操作内容。

提供需要条件的默认值

如果对象为null,有的时候是可以确定知道返回什么样的值,有的是需要获取当前数据的,需要动态的数值,例如时间戳等等。
optional提供了orElseGet的方法。这个和orElse有一些区别。我们直接看源码。

    public T orElse(T other) {
 return value != null ? value : other;
    }
    
    public T orElseGet(Supplier other) {
 return value != null ? value : other.get();
    }

orElseGet是可以提供一个Supplier来提供对象的产生。但是orElse是提供对象本身。我们可以根据return的时候可以看出。orElseGet的意思是只有在为null的时候才触发了构造,可以说具有延迟构造对象的作用。

如果存在某个值,就做一些操作,否则做另外一些操作

上面讲了通过ifPresent可以在存在某些值的时候做一些操作。如果有反向操作,就只能依靠ifPresent返回一个bool类型,然后再写if判断。
java9解决了这个问题。

 Optional userOptional = Optional.ofNullable(book);
 userOptional.map(Book::getName).filter((name) -> name.contains("张")).
  ifPresentOrElse(name -> System.out.println("购买"+name),()->{
      System.out.println("回家");
  });

加入了ifPresentOrElse,可以多加一个Runnable。用来执行null的时候的情况。

数据stream

这个也是9以后带来的特性。Optional可以转化为流。
转为流能带来更多的方便的操作,对于元素特别多的要返回的时候,原来是做不到这样的效果的,但是stream可以collect。

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号