Java8 Stream 基本类型特化流
时间:2022-07-26
本文章向大家介绍Java8 Stream 基本类型特化流,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、 基本类型特化流(数值流)
- 在下面这段对流的操作的代码中,其实隐藏着一个问题:
装箱成本
,每个原始类型都必须装箱成一个包装类型,如:
Stream<Integer> integerStream = Stream.of(1, 2, 3);
Integer sum = integerStream.reduce(0, Integer::sum);
- 为了避免不必要的拆箱和装箱,Java8引入了三个原始类型特化流接口:
IntStream
,LongStream
和DoubleStream
,将流中的元素特化为int
,long
和double
,避免暗含的装箱成本。并且,在这三个特化接口中,提供了常用的数值规约方法,可以方便地进行数值相关的操作,如min
,max
,sum
等。如果需要将基本类型特化流再转换成引用类型流,也有相应的方法支持。 - 引用类型流映射成值类型流
- 常用方法是
mapToInt()
,mapToLong()
和mapToDouble
,以及flatMapToXxx
... - 上述方法的返回值不再是Stream<T>,而是相应的数值类型流,如
IntStream
。
- 常用方法是
Stream<Integer> integerStream = Stream.of(1, 2, 3);IntStream intStream = integerStream.mapToInt(x -> x);
// 求和
int intSum = intStream.sum();
// 计算最大值
OptionalInt intMax = integerStream.mapToInt(x -> x).max();
// 计算最小值
OptionalInt intMin = integerStream.mapToInt(x -> x).min();
- 数值类型流转换成引用类型流
- 使用
.boxed()
装箱方法-
boxed()
方法实际上内部调用的都是mapToObj()
-
- 使用
IntStream intStream = integerStream.mapToInt(x -> x);
Stream<Integer> boxedIntegerStream = intStream.boxed();
Stream<Long> boxedLongStream = LongStream.range(1, 10).boxed();
二、 关于OptionalInt
- 在介绍数值流的时候,可以注意到数值流提供的几个规约方法的返回值:
- 如
sum()
返回的是int
,因为sum
存在默认值0. - 而
max()
和min()
的返回值都是OptionalInt
,没有默认值,因为设置默认值为0是一种错误的做法。而对于这三种特化流,有三个参数化的Optional类:OptionalInt
,OptionalLong
和OptionalDouble
。
- 如
// 注意range(1,1)生成的是一个空的流
OptionalInt optionalInt = IntStream.range(1, 1).max();
// 空的流无法获取到最大值
optionalInt.ifPresent(x -> System.out.println("最大值为:" + x));
// 当无结果时,返回一个默认值
System.out.println("默认最大值:" + optionalInt.orElse(1));
默认最大值:1
三、 数值范围
- 为了方便地生成一定范围内的数字,Java8提供了可以作用于
IntStream
和LongStream
的范围方法:range(start,end)
和rangeClose(start,end)
,区别是rangeClose()
会包含end
这个值。
// 生成1~100,并求和
System.out.println(IntStream.rangeClosed(1, 100).sum());
欢迎在评论区留下你看文章时的思考,及时说出,有助于加深记忆和理解,还能和像你一样也喜欢这个话题的读者相遇。
- hdu------(4302)Holedox Eating(树状数组+二分)
- spark2的SparkSession思考与总结2:SparkSession有哪些函数及作用是什么
- GO语言并发编程之互斥锁、读写锁详解
- spark2.2 SparkSession思考与总结1
- 【译】Spring 官方教程:Spring Security 架构
- hdu----(4301)Divide Chocolate(状态打表)
- hdu------(4300)Clairewd’s message(kmp)
- TensorFlow ML cookbook 第一章7、8节 实现激活功能和使用数据源
- Go语言struct类型详解
- spark1.x升级spark2如何升级及需要考虑的问题
- 使用 kubeadm 创建一个 kubernetes 集群
- Oracle 12c 多租户专题|CDB元数据内幕
- 深入分析golang多值返回以及闭包的实现
- Hadoop3.0扩展Yarn资源模型详解2:资源Profiles说明
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- PHP pthreads v3使用中的一些坑和注意点分析
- php ActiveMQ的安装与使用方法图文教程
- ThinkPHP5与单元测试PHPUnit使用详解
- php实现通过stomp协议连接ActiveMQ操作示例
- PHP pthreads v3下的Volatile简介与使用方法示例
- php实现根据身份证获取精准年龄
- php 使用ActiveMQ发送消息,与处理消息操作示例
- php使用gearman进行任务分发操作实例详解
- laravel框架select2多选插件初始化默认选中项操作示例
- PHP pthreads v3在centos7平台下的安装与配置操作方法
- laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
- PHP Beanstalkd消息队列的安装与使用方法实例详解
- 解决windows上php xdebug 无法调试的问题
- php7 图形用户界面GUI 开发示例
- Django开发的简易留言板案例详解