Java8 Stream 的深度理解

本文探讨了如何在Java8中优化Stream流的filter操作,当筛选条件复杂时,通过创建Predicate对象提高代码可读性和维护性。举例说明了将筛选条件封装到Predicate中,减少代码理解难度,并提及了流式处理中条件语句的执行次数,指出即使数据量大,filter条件也只会执行一次。
摘要由CSDN通过智能技术生成

前言

在java8中,stream流式处理极大的简化了我们的功能代码,其中用来筛选数据的filter也是我们用的非常多的,本篇文章用来记录stream运用时的思考,会不断更新,但是这篇文章不是讲解stream是如何使用的,如果想要学习stream的同学,可以戳这里

简化stream执行语句

平时大家在写流式数据处理来筛选数据时一般都会这样写

list.stream().filter(a-> {具体筛选条件}).collect(Collectors.toList());

这样的写法非常好理解,但是会存在一个不好的地方,就是这个筛选条件如果太长,或者筛选的条件逻辑比较复杂时,直接这样写对于代码的理解起来会非常类,不好维护,接下来我来讲一下解决这种问题。
在这里插入图片描述
首先我们来看下Stream类中对于filter函数的定义,可以看到其实在filter函数接收一个Predicate类型的参数。上面的英文大致的意思是如果数据匹配上给定的Predicate,就通过筛选,不然数据就会被筛掉。所以如果筛选条件过于复杂,我们是不是可以直接创建一个Predicate对象,这样在筛选时直接传入这个对象是不是就可以了。

protected <T> Predicate<T> excludeVaule(Object value) {
        return o -> o.equals(value);
    }

// 函数我就不写了,大家懂我的意思就可以咯
List<String> list = new ArrayList();
list.add("a");
list.add("b");

// 具体处理语句
list.stream().filter(excludeVaule("a")).collect(CollectUtils.toList())

上面只是举了一个例子,具体excludeVaule函数就是为了返回Predicate对象,其中的参数可以任意(甚至可以传入一个Function对象,也可以啥也不传)。

对于难点就是excludeVaule的返回语句中o这个对象是不是不太好理解是啥,其实这只是一种函数式编程的简化而已。
在这里插入图片描述
因为Predicate只有一个需要实现的接口,那么这个接口就可以不需要写实现的函数名称,可以直接使用函数式编程来实现这个接口,@FunctionalInterface注解只是一个标识的注解,并没有实际作用的,他就是标识了该注解注释了的接口就是可以使用函数式编程。而上面o的数据就是stream数据流过来的,数据流到了filter处,就判断符合Predicate的数据,符合的数据就通过筛选。

流式处理中条件语句执行次数

list.stream().filter(a-> {具体筛选条件}).collect(Collectors.toList());

还是以该语句为例,假设list中的数据有3条,那么大家思考一下筛选条件会执行几遍。
在这里插入图片描述
大家想一下结果是多少?
在这里插入图片描述
结果是1,说明只是执行了一次,具体stream执行的实现我水平还不够,还没有找到这个是如何实现的,但是结论需要记录一下,嘿嘿。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值