通过前面那篇文章,我们已经对Stream API有了初步的认识,并对它在集合处理中的增强作用表示了肯定。同时我们上篇中示例了forEach、fiter、sum这些常用的功能,本篇我们只讲reduce。

reduce的作用是把stream中的元素给组合起来。至于怎么组合起来:它需要我们首先提供一个起始种子,然后依照某种运算规则使其与stream的第一个元素发生关系产生一个新的种子,这个新的种子再紧接着与stream的第二个元素发生关系产生又一个新的种子,就这样依次递归执行,最后产生的结果就是reduce的最终产出,这就是reduce的算法最通俗的描述;那么结合实际的业务场景来说,运用reduce我们可以做sum,min,max,average,所以这些我们称之为针对具体应用场景的reduce,这些常用的reduce,stream api已经为我们封装了对应的方法。

以下给出一些具体应用场景的reduce实现方式:

sum:

 @Test
public void testSum() {
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5); // 没有起始值时返回为Optional类型
Optional<Integer> sumOptional = integers.stream().reduce(Integer::sum);
System.out.println(sumOptional.get()); // 可以给一个起始种子值
Integer sumReduce = integers.stream().reduce(0, Integer::sum);
System.out.println(sumReduce); //直接用sum方法
Integer sum = integers.stream().mapToInt(i -> i).sum();
System.out.println(sum);
}

concat

@Test
public void testConcat() {
//构造字符串流
List<String> strs = Arrays.asList("H", "E", "L", "L", "O"); // reduce
String concatReduce = strs.stream().reduce("", String::concat);
System.out.println(concatReduce);
}

min

 @Test
public void testMin() { //min reduce
Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5);
Integer minReduce = integerStream.reduce(Integer.MAX_VALUE, Integer::min);
System.out.println(minReduce); // min
Stream<Integer> integerStream1 = Stream.of(1, 2, 3, 4, 5);
OptionalInt min = integerStream1.mapToInt(i -> i).min();
System.out.println(min.getAsInt());
}

max
@Test
public void testMax() {

//max reduce
Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5);
Integer maxReduce = integerStream.reduce(Integer.MIN_VALUE, Integer::max);
System.out.println(maxReduce);

// max

@Test
public void testMax() { //max reduce
Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5);
Integer maxReduce = integerStream.reduce(Integer.MIN_VALUE, Integer::max);
System.out.println(maxReduce); // max
Stream<Integer> integerStream1 = Stream.of(1, 2, 3, 4, 5);
OptionalInt max = integerStream1.mapToInt(i -> i).max();
System.out.println(max.getAsInt());
}

————————————————
版权声明:本文为CSDN博主「争夕」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010221709/article/details/76686146

最新文章

  1. Linux搭建nfs服务器
  2. LINQ to Entities 查询语法
  3. iOS--隐藏和显示TabBar的方法
  4. 技术分享:WIFI钓鱼的入门姿势
  5. iOS UIButton EdgeInsets
  6. ripple
  7. SVNKit getFileFromSVN
  8. 关于MVC项目中的主管放行
  9. C# PDF转Image图片
  10. PHP 十万数字不同数组取最大的5个 (经典面试题topK) (原)
  11. 翻转一个数组(c++实现)
  12. 【BZOJ5293】[BJOI2018]求和(前缀和,LCA)
  13. A1014. Waiting in Line
  14. 关于Oracle归档的一些操作
  15. (19)ThreadPoolExecutor线程池
  16. What’s New In GRANDstack?
  17. shell脚本一键安装nginx
  18. Linux下部署tomcat及tomcat war包应用程序
  19. LeetCode: Merge Two Sorted Lists 解题报告
  20. 学习笔记&#183;堆优化$\mathscr{dijkstra}$

热门文章

  1. 什么是RPC? (全面了解)
  2. APIO2022 游记
  3. 如何用 Python 隐藏你的 API 密钥
  4. python之路27 单例模式实现方式、pickle模块、选课系统目录搭建
  5. 写一个 Markdown 博客客户端
  6. nmap脚本详解
  7. do while 出口條件循環
  8. 【开源】libserial_protocol:适用于单片机的串口通信协议基础库
  9. 一篇文章带你掌握Flex布局的所有用法
  10. 《Terraform 101 从入门到实践》 第二章 Providers插件管理