JAVA8 Stream方法使用详解reduce、IntStream(二)
文章目录
- 一 归约
- 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(二)相关推荐
- JAVA8 Stream方法使用详解Filter、map等用法(一)
文章目录 一.筛选和切片 1.谓词筛选filter 2.筛选不同的元素distinct 3.截断流limit 4.跳过元素 二.映射 1.map对每个元素应用函数 2.流的扁平化 三.查找和匹配 1. ...
- reduce()方法使用详解
reduce()方法使用详解 reduce()定义: reduce()方法接受一个函数作为累加器,数组中的每一个值(从左到右)开始缩减,最终计算为一个值. reduce()可以作为一个高阶函数,用于函 ...
- java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用
java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用
- java8 四大函数式接口 和 用于数据处理的 stream流 使用详解
文章目录 Stream 使用示例 四大函数式接口 Function 功能型接口 Consumer 消费型接口 Supplier 提供型接口 Predicate 断言型接口 常用 api stream, ...
- Atitit.jdk java8的语法特性详解 attilax 总结
Atitit.jdk java8的语法特性详解 attilax 总结 1.1. 类型推断这个特别有趣的.鲜为人知的特性1 2. Lambda1 2.1. 内部迭代意味着改由Java类库来进行迭代,而不 ...
- golang导入git包_使用go module导入本地包的方法教程详解
go module 是Go1.11版本之后官方推出的版本管理工具,并且从 Go1.13 版本开始, go module 将是Go语言默认的依赖管理工具.到今天 Go1.14 版本推出之后 Go mod ...
- java condition详解_Java使用Condition控制线程通信的方法实例详解
Java使用Condition控制线程通信的方法实例详解 发布于 2020-4-20| 复制链接 摘记: 本文实例讲述了Java使用Condition控制线程通信的方法.分享给大家供大家参考,具体如下 ...
- python怎么画条形图-python绘制条形图方法代码详解
1.首先要绘制一个简单的条形图 import numpy as np import matplotlib.pyplot as plt from matplotlib import mlab from ...
- python装饰器函数-Python函数装饰器常见使用方法实例详解
本文实例讲述了Python函数装饰器常见使用方法.分享给大家供大家参考,具体如下: 一.装饰器 首先,我们要了解到什么是开放封闭式原则? 软件一旦上线后,对修改源代码是封闭的,对功能的扩张是开放的,所 ...
最新文章
- plsql 设置鼠标行执行_Excel中执行“宏”的方法有哪些?我列举了这5个,你会几个...
- 小学教师计算机国培培训总结,小学教师国培个人研修总结
- 「网络流24题」 12. 软件补丁问题
- 【Laravel】使用mews/captcha验证码图片不显示,报错 Call to undefined function Intervention\Image\Gd\imagettfbbox()
- Linux(15)-C/C++、PHP、JAVA概述
- 2017.3.31 洞穴勘测 思考记录
- Feign 重试解析
- MVC中使用编辑器提交内容时出错的解决方法
- 多线激光雷达遇到的问题
- 虚拟机scala安装
- hiberfil.sys和swapfile.sys文件的删除
- 使用js jquery去搭建完成京东购物车
- 分解成质因数(如435234=251*17*17*3*2
- LeetCode/LintCode 题解丨一周爆刷分治法:合并两棵二叉树
- 当CNN遇见Transformer!华为诺亚提出CMT:新视觉Backbone
- 你要做鸡头,还是凤尾?
- 截至2017 年 2 月全球桌面操作系统市场份额:Linux 占 2.05%...
- 使用IDEA+maven配置SSM项目步骤,以及配置项目过程中遇到的各种坑(SSM配置文件加载问题,使用注解开发问题,maven开发SSM项目步骤)
- Java编写udf函数
- 大学计算机基础--1
热门文章
- java注释日志打印_java 注解结合 spring aop 实现自动输出日志
- IJCAI 2021 ICAPS 2021自动强化学习挑战赛正式开赛
- 机器学习实践:TensorFlow最后一个epoch训练损失函数显著增大
- c++17(23)-typedef
- python3精要(24)-函数内省、函数注释、函数属性
- C指针原理(18)-C指针基础
- 应届生是这辈子最大的一次优势,也是最后一次!
- 【Python基础】一文搞定pandas的数据合并
- 双塔模型没效果了?请加大加粗!
- 如何用杠铃策略,构建你的“反脆弱性”