stream流的归约

stream流的归约

stream流的归约是将stream流中的元素聚合,类似约sql的聚合。归约属于stream流的终端操作。

终端操作的注意点:

  1. stream流没有终端操作不会处理任何数据,没有终端操作的stream流很大可能是个bug!
  2. stream流只能有一个终端操作,并且不能再次重用该stream流,否则会抛出IllegalStateException异常

使用BinaryOperator二元操作对stream流归约

需要注意2点

  1. stream流可以通过parallel()进行并行计算

  2. BinaryOperator应该具有associativity(结合律,关联性)

A=B⋃C⇒Red(A)=Red(Red(B),Red(C))A = B ⋃ C ⇒ Red(A) = Red(Red(B), Red(C)) A=B⋃C⇒Red(A)=Red(Red(B),Red(C))

BinaryOperator归约中的identity element(单位元,即 i op a = a op i = a,i为单位元)

探索Stream API中的归约方法

reduce()

有单位元的归约

List<Integer> ints = List.of(3, 6, 2, 1);
BinaryOperator<Integer> sum = (a, b) -> a + b;
int identity = 0;int result = identity;
for (int i: ints) {result = sum.apply(result, i);
}System.out.println("sum = " + result);

使用reduce()

Stream<Integer> ints = Stream.of(0, 0, 0, 0);int sum = ints.reduce(10, (a, b) -> a + b);
System.out.println("sum = " + sum);

结果

sum = 10

没有单位元的归约

Stream<Integer> ints = Stream.of(2, 8, 1, 5, 3);
Optional<Integer> optional = ints.reduce((i1, i2) -> i1 > i2 ? i1: i2);if (optional.isPresent()) {System.out.println("result = " + optional.orElseThrow());
} else {System.out.println("No result could be computed");
}

结果

result = 8

在一个方法中融合映射合归约

<U> U reduce(U identity,BiFunction<U, ? super T, U> accumulator,BinaryOperator<U> combiner);

示例

Stream<String> strings = Stream.of("one", "two", "three", "four");BinaryOperator<Integer> combiner = (length1, length2) -> length1 + length2;
BiFunction<Integer, String, Integer> accumulator =(partialReduction, element) -> partialReduction + element.length();int result = strings.reduce(0, accumulator, combiner);
System.out.println("sum = " + result);

结果

sum = 15

示意图

stream流的归约相关推荐

  1. Java 8 - Stream流骚操作解读2_归约操作

    文章目录 Pre 什么是归约操作 元素求和 reduce reduce如何运行的 最大值和最小值 Pre Java 8 - Stream流骚操作解读见到过的终端操作都是返回一个 boolean ( a ...

  2. Java8种Stream流相关操作——集合的筛选、归约、分组、聚合

    过滤.筛选   filter skip /*** 过滤 筛选*/@Testpublic void test2(){List<String> list = Arrays.asList(&qu ...

  3. Java8 Stream 流的创建、筛选、映射、排序、归约、分组、聚合、提取与组合、收集、接合、foreach遍历

    目录 一  了解Stream 1 Stream概述 那么什么是Stream? Stream可以由数组或集合创建 Stream有几个特性: Stream流的起始操作 2 Stream的创建----Str ...

  4. Java 8 - Stream流骚操作解读

    文章目录 分类 中间操作 终端操作 使用Stream流 筛选和切片 用谓词筛选 filter 筛选各异的元素 distinct 截短流 limit 跳过元素 skip 映射 对流中每一个元素应用函数 ...

  5. Stream流的基本使用方法

    Stream流的基本使用方法 0.常用方法 在介绍的各种方法中,凡是返回值仍然为Stream接口的为函数拼接方法,它们支持链式调用:而返回值不再为Stream接口的为终结方法,不再支持链式调用.如下表 ...

  6. jdk8新特性(二)Stream流式操作

    1.流处理过程 2.Stream流式分类 Stream,IntStream,LongStream,DoubleStream 3.操作符 Stream 的一系列操作必须要使用终止操作,否者整个数据流是不 ...

  7. JAVA的stream流操作详细解析

    java的stram流操作 为什么需要 Stream 流与集合的区别 对比:原始集合操作与Stream集合操作 (过滤/映射/扁平化/遍历/排序/去重/跳过/截断的应用) 流的组成 流操作的分类 流的 ...

  8. 第四章 函数式编程(Lambda表达式Stream流)

    一.Lambda表达式 特点:是匿名函数 2是可传递 匿名函数:需要一个函数,但又不想命名一个函数的场景下使用lambda表达式,使用lambda表达式时函数内容应该简单 可传递:将lambda表达式 ...

  9. Java 8 Stream流的常见操作

    Stream流的使用 在 Java 8 中, 集合接口有两个方法来生成流: stream() − 为集合创建串行流.parallelStream() − 为集合创建并行流. 串行流 如果是数组的话,可 ...

最新文章

  1. 中国厨房家具行业消费需求调查与品牌格局分析报告2022版
  2. 无法激活安全认证服务
  3. springboot项目中使用日志
  4. Java 代码完成删除文件、文件夹操作
  5. 1190 最小公倍数之和 V2
  6. P5445-[APIO2019]路灯【set,树状数组套线段树】
  7. tomcat上传文件到不同服务器,使用SpringMVC进行跨服务器上传文件出现的那些坑
  8. php如何查询mysql数据库字符集_修改及查看mysql数据库的字符集_MySQL
  9. C 获得程序执行时间
  10. HttpClient settimeout 设置
  11. linux查看ipmi端口down,Linux通过命令行设置IPMI的解决方法
  12. Java设计模式--单例模式(代码详解懒汉、饿汉模式)
  13. 透明质酸修饰牛血清蛋白|HA-BSA|荧光FITC标记透明质酸|FITC-peg-BSA
  14. vue 接口请求下载文件
  15. 苹果home键失灵_苹果手机屏幕失灵售后教你怎么处理
  16. Pico VR 应用开发基础教程
  17. 【通通免费】分享3个超级实用的电脑小工具,一个都不能少哦!
  18. 【MineCraft】-- 学习我的世界Mod制作引雷附魔书与事件
  19. su:认证失败,同时,sudo passwd失效,不在sudors中,此事将被报告
  20. python数据结构: 有序表

热门文章

  1. MATLAB非线性变换
  2. 奋斗终身,看卢俊卿心目中想抵达的幸福
  3. 亓琳〆Lutte╰→羋孖ゝ
  4. 技术分享|交互设计七大定律(上篇)
  5. java多线程基础篇(二)java线程常见问题Thread Dump日志分析
  6. 项目集成管理的6个关键过程
  7. VS工程中sdf和ipch文件解决
  8. buaacoding G.CWD的套圈游戏
  9. Eclipse解决启动慢
  10. || 与 ?. 与 ??