文章目录

  • 一 归约
    • 1、元素求和
    • 2、最大值和最小值
  • 二、数值流
    • 1、映射数值流
    • 2、转换对象流
    • 3、数值范围
  • 三、构建流
    • 1、由值创建流
    • 2、由数组创建流
    • 3、由文件生成流
    • 4、由函数生成流

此章节继续介绍其它Stream API用法

一 归约

归约将流中的所有元素反复结合起来,归约成一个值。用函数式的术语来说,可以称为折叠。

1、元素求和

reduce接受两个参数:
1、一个是初始值
2、一个是BinaryOperator将两个元素结合成一个新值,比如:(a,b) -> a+b
举例求和:

 public static void testReduce() {List<Integer> integers = Arrays.asList(1, 2, 3, 45, 6);Integer reduce = integers.stream().reduce(0, (a, b) -> a + b);System.out.println(reduce);}

reduce还有个重载方法不接受初始值,返回的是一个Optional。

2、最大值和最小值

给定两个元素返回一个最大值的lambda,reduce会考虑新值和流中的下一个元素,并产生一个最大值,直到流消费结束。
举例说明:

public static void testReduceMax() {List<Integer> integers = Arrays.asList(1, 2, 3, 45, 6);Optional<Integer> reduce = integers.stream().reduce(Integer::max);System.out.println(reduce.get());Optional<Integer> reduce1 = integers.stream().reduce(Integer::min);System.out.println(reduce1.get());}

使用reduce的好处,迭代被内部迭代抽象了,内部实现得以选择并行执行reduce操作。

二、数值流

使用reduce可以计算流中元素的总和,但是这样是有问题,有一个暗含的装箱成本,每个integer都必须拆箱成一个原始类型,再求和,可以直接调用sum:

 public static void testReduceSum() {List<Integer> integers = Arrays.asList(1, 2, 3, 45, 6);int sum = integers.stream().mapToInt(d -> d.intValue()).sum();System.out.println(sum);}

1、映射数值流

java8引入了三个原始类型流解决装箱拆箱问题:IntStream、DoubleStream、LongStream。每个接口中都有对数sum,max,min,average等方法。
例:

 public static void testReduceSum() {List<Integer> integers = Arrays.asList(1, 2, 3, 45, 6);int sum = integers.stream().mapToInt(d -> d.intValue()).sum();OptionalInt max = integers.stream().mapToInt(d -> d.intValue()).max();OptionalInt min = integers.stream().mapToInt(d -> d.intValue()).min();OptionalDouble average = integers.stream().mapToInt(d -> d.intValue()).average();System.out.println(sum);}

2、转换对象流

将数值流转化成对象流调用方法,调用boxed方法。

public static void testReduceObj() {List<Integer> integers = Arrays.asList(1, 2, 3, 45, 6);IntStream intStream = integers.stream().mapToInt(d -> d.intValue());Stream<Integer> boxed = intStream.boxed();}

3、数值范围

IntStream、DoubleStream、LongStream生成流范围range不包含结束值,rangeClosed包含结束值。

public static void testRangeClosed() {IntStream intStream = IntStream.rangeClosed(0, 100).filter(d -> d % 2 == 0);long count = intStream.count();System.out.println(count);}

三、构建流

创建流的方法有很多,值序列、数据组、文件创建流。

1、由值创建流

静态方法Stream.of。例:

public static void testStreamof() {Stream<String> java8 = Stream.of("java8", "lambda", "in action");}
}

2、由数组创建流

Arrays.stream

int[] i = new int[]{1,3,34};IntStream stream = Arrays.stream(i);

3、由文件生成流

java中用于处理文件的I/O操作已更新,以便用Stream API。
java.nio.file.Files中有很多静态方法会返回一个stream。一个很有用的方法Files.lines。例:

 Stream<String> lines = Files.lines(Paths.get("xx.txt"));

4、由函数生成流

Stream.iterate和Stream.generate可以创建无限流。

Stream.iterate,iterate接受一个初始值为0,接受参数(final T seed, final UnaryOperator f)
例:

 public static void testiterate() {Stream<Integer> iterate = Stream.iterate(0, n -> n + 2);}

此方法生成一个正偶数的流。

Stream.generate,generate也可以生成一个无限流,但generate不是依次 对每个新生成的值应用函数。接受参数Supplier s

 Stream<Double> generate = Stream.generate(Math::random);

JAVA8 Stream方法使用详解reduce、IntStream(二)相关推荐

  1. JAVA8 Stream方法使用详解Filter、map等用法(一)

    文章目录 一.筛选和切片 1.谓词筛选filter 2.筛选不同的元素distinct 3.截断流limit 4.跳过元素 二.映射 1.map对每个元素应用函数 2.流的扁平化 三.查找和匹配 1. ...

  2. reduce()方法使用详解

    reduce()方法使用详解 reduce()定义: reduce()方法接受一个函数作为累加器,数组中的每一个值(从左到右)开始缩减,最终计算为一个值. reduce()可以作为一个高阶函数,用于函 ...

  3. java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用

    java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用

  4. java8 四大函数式接口 和 用于数据处理的 stream流 使用详解

    文章目录 Stream 使用示例 四大函数式接口 Function 功能型接口 Consumer 消费型接口 Supplier 提供型接口 Predicate 断言型接口 常用 api stream, ...

  5. Atitit.jdk java8的语法特性详解 attilax 总结

    Atitit.jdk java8的语法特性详解 attilax 总结 1.1. 类型推断这个特别有趣的.鲜为人知的特性1 2. Lambda1 2.1. 内部迭代意味着改由Java类库来进行迭代,而不 ...

  6. golang导入git包_使用go module导入本地包的方法教程详解

    go module 是Go1.11版本之后官方推出的版本管理工具,并且从 Go1.13 版本开始, go module 将是Go语言默认的依赖管理工具.到今天 Go1.14 版本推出之后 Go mod ...

  7. java condition详解_Java使用Condition控制线程通信的方法实例详解

    Java使用Condition控制线程通信的方法实例详解 发布于 2020-4-20| 复制链接 摘记: 本文实例讲述了Java使用Condition控制线程通信的方法.分享给大家供大家参考,具体如下 ...

  8. python怎么画条形图-python绘制条形图方法代码详解

    1.首先要绘制一个简单的条形图 import numpy as np import matplotlib.pyplot as plt from matplotlib import mlab from ...

  9. python装饰器函数-Python函数装饰器常见使用方法实例详解

    本文实例讲述了Python函数装饰器常见使用方法.分享给大家供大家参考,具体如下: 一.装饰器 首先,我们要了解到什么是开放封闭式原则? 软件一旦上线后,对修改源代码是封闭的,对功能的扩张是开放的,所 ...

最新文章

  1. plsql 设置鼠标行执行_Excel中执行“宏”的方法有哪些?我列举了这5个,你会几个...
  2. 小学教师计算机国培培训总结,小学教师国培个人研修总结
  3. 「网络流24题」 12. 软件补丁问题
  4. 【Laravel】使用mews/captcha验证码图片不显示,报错 Call to undefined function Intervention\Image\Gd\imagettfbbox()
  5. Linux(15)-C/C++、PHP、JAVA概述
  6. 2017.3.31 洞穴勘测 思考记录
  7. Feign 重试解析
  8. MVC中使用编辑器提交内容时出错的解决方法
  9. 多线激光雷达遇到的问题
  10. 虚拟机scala安装
  11. hiberfil.sys和swapfile.sys文件的删除
  12. 使用js jquery去搭建完成京东购物车
  13. 分解成质因数(如435234=251*17*17*3*2
  14. LeetCode/LintCode 题解丨一周爆刷分治法:合并两棵二叉树
  15. 当CNN遇见Transformer!华为诺亚提出CMT:新视觉Backbone
  16. 你要做鸡头,还是凤尾?
  17. 截至2017 年 2 月全球桌面操作系统市场份额:Linux 占 2.05%...
  18. 使用IDEA+maven配置SSM项目步骤,以及配置项目过程中遇到的各种坑(SSM配置文件加载问题,使用注解开发问题,maven开发SSM项目步骤)
  19. Java编写udf函数
  20. 大学计算机基础--1

热门文章

  1. java注释日志打印_java 注解结合 spring aop 实现自动输出日志
  2. IJCAI 2021 ICAPS 2021自动强化学习挑战赛正式开赛
  3. 机器学习实践:TensorFlow最后一个epoch训练损失函数显著增大
  4. c++17(23)-typedef
  5. python3精要(24)-函数内省、函数注释、函数属性
  6. C指针原理(18)-C指针基础
  7. 应届生是这辈子最大的一次优势,也是最后一次!
  8. 【Python基础】一文搞定pandas的数据合并
  9. 双塔模型没效果了?请加大加粗!
  10. 如何用杠铃策略,构建你的“反脆弱性”