Java8中 stream,filter 等功能代替for循环(及)isPresent( ) 和 ifPresent() 简单应用

 Duang,最近搭建了一个自己的博客小破站,欢迎各位小伙伴来访吖:ares-coder-blog-portalhttps://www.ares-stack.cn/blog_service/#/game

直接上代码,比较实在。

对象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 函数式支持的功能。

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

理解、学习与使用 Java 中的 Optional - OSCHINA - 中文开源技术交流社区

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

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

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

Java 8 Optional 类 | 菜鸟教程


 所以,我们可以这样子使用,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));

5,分组

.collect(Collectors.groupingBy(实体::get字段))

参考来源:

java8 stream ,filter 等功能代替for循环 - 依米艳 - 博客园

  • 38
    点赞
  • 184
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值