java stream-中间操作 filter、map、flatMap、reduce 作者:马育民 • 2023-04-07 20:07 • 阅读:10067 # filter 根据 **规则** 对数据进行 **筛选过滤**,符合规则的数据保留,不符合规则的数据丢弃。 [![](/upload/0/0/1IX42weAZkRH.png)](/upload/0/0/1IX42weAZkRH.png) ### 例子 - Predicate接口对象 ``` List list = new ArrayList<>(); Collections.addAll(list,"李雷", "韩梅梅", "lucy", "lisi","李小四"); list.stream() .filter(new Predicate(){ @Override public boolean test(String item) { return item.startsWith("李"); } }) // 过滤姓李的数据 .forEach(item -> System.out.println(item)); ``` ### 例子 - lambda表达式 ``` List list = new ArrayList<>(); Collections.addAll(list,"李雷", "韩梅梅", "lucy", "lisi","李小四"); list.stream() .filter(item -> item.startsWith("李")) // 过滤姓李的数据 .forEach(item -> System.out.println(item)); ``` ### 例子 - 多个条件 ``` List list = new ArrayList<>(); Collections.addAll(list,"李雷", "韩梅梅", "lucy", "lisi","李小四"); list.stream() .filter(item -> item.startsWith("李")) // 过滤姓李的数据 .filter(item -> item.length() == 2) // 过滤姓名是2个字的 .forEach(item -> System.out.println(item)); ``` # map 将 **集合** 中的 **每个元素** 传入 **函数** 后,**生成一个新元素**,并将 **新元素** 组成一个 **集合**,并返回该集合 **注意:**map处理前后的元素数量是相同的 [![](http://65242847.gitee.io/pic/scala/Snipaste_2021-06-16_21-58-15.png)](http://65242847.gitee.io/pic/scala/Snipaste_2021-06-16_21-58-15.png) ### 例子 将流中的每个数据乘2 ``` List list = new ArrayList<>(); Collections.addAll(list,10,15,2,4,8); list.stream() .map(item -> item * 2) // 将流中的每个数据乘2 .forEach(item -> System.out.println(item)); ``` # flatMap 如果流中的数据是 **数组** 或 **集合**,可以指定规则,将其展平 ### 简单例子 [![](http://65242847.gitee.io/pic/scala/Snipaste_2021-06-17_13-08-42.png)](http://65242847.gitee.io/pic/scala/Snipaste_2021-06-17_13-08-42.png) ``` Integer[] arr2 = {1,2}; Integer[] arr3 = {3,4}; Integer[][] arr = {arr2,arr3}; Arrays.stream(arr) .flatMap( item -> Arrays.stream(item)) .forEach(item -> System.out.println(item)); ``` ### 复杂例子 ``` List list = new ArrayList<>(); Collections.addAll(list,"李雷 lili","韩梅梅 lucy"); list.stream() .flatMap( item -> Arrays.stream( item.split(" ") )) .forEach(item -> System.out.println(item)); ``` # reduce() reduce() 函数会对集合中元素进行聚合: 1. 将集合中的 第 1、2 个元素传给 lambda表达式,计算后得出结果 2. 再将该结果与第3个元素 传给 lambda表达式,计算后得出结果 3. 以此类推,最后得到结果 [![](http://65242847.gitee.io/pic/scala/QQ20210525093959.png)](http://65242847.gitee.io/pic/scala/QQ20210525093959.png) ### 例子 求集合元素累加和 ``` List list = new ArrayList<>(); Collections.addAll(list,1,2,3,4); Optional res = list.stream() .reduce((i1, i2) -> i1 + i2); System.out.println(res.get()); ``` 原文出处:http://malaoshi.top/show_1IX5HCIPoA6e.html