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

Optional,java

程序员文章站 2022-06-07 12:30:07
...

直接上代码,比较实在。

对象A

    public Class A{
        private Long id;
        private String userName;
      
        ....省略get和set方法  
    }

在List<A>中,查找 userName 为 "小明"  的对象 A。

在java8中,我们可以这么玩

    1,查找集合中符合条件的第一个对象,如果可以明确条件只能匹配一个,使用上 findFirst(),性能更好。    

 Optional<A> firstA= AList.stream()
                              .filter(a -> "小明".equals(a.getUserName()))
                              .findFirst();

关于Optional,java API中给了解释。

        A container object which may or may not contain a non-null value. If a value is present, isPresent() will return true and get() will return the value.
         
        一个容器对象,它可能包含也可能不包含非空值。如果存在一个值,isPresent()将返回true, get()将返回值。

小结:

Optional 是 Java 语言的有益补充 —— 它旨在减少代码中的 NullPointerExceptions,虽然还不能完全消除这些异常。

它也是精心设计,自然融入 Java 8 函数式支持的功能。

总的来说,这个简单而强大的类有助于创建简单、可读性更强、比对应程序错误更少的程序。

https://www.oschina.net/translate/understanding-accepting-and-leveraging-optional-in?lang=chs&page=2#

 

Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。

Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。

Optional 类的引入很好的解决空指针异常。

http://www.runoob.com/java/java8-optional-class.html

 所以,我们可以这样子使用,firstA.isPresent()作为判断

   

if (firstA.isPresent()) {
         A a = firstA.get();   //这样子就取到了这个对象。
    }
    else {
       //没有查到的逻辑
    }

还可以使用

ifPresent 用于对过滤出的数据如果存在。如果经过过滤条件后,有数据的话就可以进行修改。

 

    Optional<A> firstA= AList.stream()
                              .filter(a -> "小明".equals(a.getUserName()))
                              .findFirst()
                              .ifPresent(a -> {
                                  a.setUserName("明明");
                              })

    2,如果想返回集合呢。可以使用这个(此处即:返回经过过滤后的集合)

   

  List<A> aList= AList.stream()
                          .filter(a -> "小明".equals(a.getUserName()))
                          .collect(Collectors.toList());

扩展:如去掉空

    //去掉名称为空的
        

    List<A> aList = AList.stream()
                    .filter(a-> StringUtil.isNotEmpty(a.getName()))
                    .collect(Collectors.toList());

    3,抽取对象中所有的id的集合

   

 //map(A::getId) 中的 A 为实体类
    List<Long> idList = AList.stream()
                             .map(A::getId)
                             .collect(Collectors.toList());

    4,返回map

    //A 为实体类

    Map<Long, A> map = AList.stream()
                            .filter(a-> StringUtil.isNotEmpty(a.getName()))
                            .collect(Collectors.toMap(A::getId, a -> a));