在Stream里元素都是对象,那么,当我们操作一个数字流的时候就不得不考虑一个问题,拆箱和装箱。虽然自动拆箱不需要我们处理,但依旧有隐含的成本在里面。Java8引入了3个原始类型特化流接口来解决这个问题:IntStream,DoubleStream,LongStream, 分别将流中的元素特化为int、long、doub,从而避免了暗含的装箱成本。每个接口都带来了进行常用数值归约的新方法,比如求和sum,求最大值max。此外还有必要时再把他们转换回对象流的方法。这些特化的原因就是装箱造成的复杂性--类似int和Integer之间的效率差异。

将对象流映射为数值流

常用方法为mapToInt, mapToDouble, mapToLong,这些方法和map相同,只是它们返回一个特化流,而不是Stream。

@Test
public void testToInt() {final ArrayList<Dish> dishes = Lists.newArrayList(new Dish("pork", false, 800, Type.MEAT),new Dish("beef", false, 700, Type.MEAT),new Dish("chicken", false, 400, Type.MEAT),new Dish("french fries", true, 530, Type.OTHER),new Dish("rice", true, 350, Type.OTHER),new Dish("season fruit", true, 120, Type.OTHER),new Dish("pizza", true, 550, Type.OTHER),new Dish("prawns", false, 300, Type.FISH),new Dish("salmon", false, 450, Type.FISH));IntStream intStream = dishes.stream().mapToInt(Dish::getCalories);
}

将数值流转回对象流

我们虽然会使用数值流进行计算,但经常需要回归到对象,那么就需要将int stream装箱为Integer stream. 可以使用boxed()方法。

Stream<Integer> boxed = intStream.boxed();

默认值OptinalInt

由于数值流经常会有默认值,比如默认为0。数值特化流的终端操作会返回一个OptinalXXX对象而不是数值。

OptionalInt optionalInt = dishes.stream().mapToInt(Dish::getCalories).max();int max = optionalInt.orElse(1);

生成一个数值范围流

有时候需要生成一个数值范围,比如1到30. 可以使用for循环,也可以直接使用数值流。

创建一个包含两端的数值流,比如1到10,包含10:

IntStream intStream = IntStream.rangeClosed(1, 10);

创建一个不包含结尾的数值流,比如1到9:

IntStream range = IntStream.range(1, 9);

测试demo: https://github.com/Ryan-Miao/someTest/blob/master/src/main/java/com/test/java8/streams/NumStreamExample.java

以上出自《Java8 In Action》

Java8-Stream之数值流相关推荐

  1. java8 stream 最大值_JDK8-Stream流常用方法

    Stream流的使用 流操作是Java8提供一个重要新特性,它允许开发人员以声明性方式处理集合,其核心类库主要改进了对集合类的 API和新增Stream操作.Stream类中每一个方法都对应集合上的一 ...

  2. 【Java8实战】并行流

    引言 在前面,学习使用Lambda表达式的过程中,对于集合的处理,都会使用到Stream流处理.为了提高性能,我们可以使用parallelStream并行流. 并行流 并行流就是一个把内容分成多个数据 ...

  3. java8 数值流 装箱和拆箱讲解

    1.原始类型流特化 首先引入两个概念 原始类型:int.double.byte.char 引用类型:Integer.Byte.Object.List 在Java中,①将原始类型转换为对应的引用类型的机 ...

  4. JAVA8 Stream流之reduce()方法详解

    reduce()简介 Reduce 原意:减少,缩小 根据指定的计算模型将Stream中的值计算得到一个最终结果 解释:reduce 操作可以实现从Stream中生成一个值,其生成的值不是随意的,而是 ...

  5. Java 8 - 数值流Numberic Stream

    文章目录 Pre 原始类型流特化 映射到数值流 (mapToInt . mapToDouble 和 mapToLong ) 转换回数值流 boxed 默认值OptionalInt 数值范围( rang ...

  6. java8 Stream的实现原理 (从零开始实现一个stream流)

    1.Stream 流的介绍 1.1 java8 stream介绍 java8新增了stream流的特性,能够让用户以函数式的方式.更为简单的操纵集合等数据结构,并实现了用户无感知的并行计算. 1.2  ...

  7. [java8] Stream流

    基本概念 Java8中流是指一个支持串行或并行聚合操作的元素序列.一个流由三部分组成: 数据源:可能是一个数组.集合.生成器函数或者IO通道 0个或者多个中间操作:将一个stream转换为另一个str ...

  8. java双层list扁平化,浅谈java8 stream flatMap流的扁平化操作

    概念: Steam 是Java8 提出的一个新概念,不是输入输出的 Stream 流,而是一种用函数式编程方式在集合类上进行复杂操作的工具.简而言之,是以内部迭代的方式处理集合数据的操作,内部迭代可以 ...

  9. java8 stream运行原理之并行流原理详解

    上一篇文章<java8 stream运行原理之顺序流原理详解>介绍了顺序流的执行原理,本文接着上一篇介绍并行流的执行原理. 一.如何创建并行流 调用parallel()方法可以创建并行流, ...

  10. Java8——Stream流

    Java8--Stream流 Stream是数据渠道,用于操作集合.数组等生成的元素序列. Stream操作的三个步骤: 创建Stream 中间操作 终止操作 一.获取stream的四种方式 1.通过 ...

最新文章

  1. 网络管理员&MCSE2003之12: 第8章 应用管理模板和审核策略
  2. 福特第三代自动驾驶在美开启公开道路测试
  3. hdu 2059(dp)
  4. python基础(part3)--运算符
  5. android错误怎么关机,Android系统小技巧:系统崩溃了只重启部分子系统,而不是全部重启...
  6. python画logistic拟合曲线_Logistic回归python实现
  7. Android多线程--AsyncTask
  8. HDU 1233 - 还是畅通工程
  9. javascript跑马灯效果
  10. C#基础代码笔记(四)
  11. VIP邮箱发出去的邮件能撤回吗?怎么撤回邮件?
  12. cad审图软件lisp_CAD审图标记下载_CAD审图标记官方下载_CAD审图标记v4-华军软件园...
  13. no such instruction问题
  14. Root后安装Xposed框架卡Logo问题
  15. PPT放映时不能全屏播放解决方法
  16. 2021年三季度中国家居用品行业A股上市企业营收排行榜:欧派家居、顾家家居排名前2位,且近五年第三季度的净利润均逐年递增(附热榜TOP61详单)
  17. Gohead学习笔记
  18. 青铜修炼手册:Axure地图搜索交互
  19. 金九银十|前端真实面试知识点梳理
  20. 敏捷领导力系列介绍--全景领导力LCP的学习心得

热门文章

  1. tomcat的acceptCount、maxThreads、connectionTimeout参数调整
  2. Python-07:Python语法基础-数据类型
  3. UVALive 7276 Wooden Signs (DP)
  4. Spring MVC Maven 环境搭建与部署
  5. 【转】 CSS3实现10种Loading效果
  6. 【淘宝技术这十年】,读后总结篇 转载
  7. HTML5与CSS3权威指南.pdf7
  8. Oracle 在 Linux 下移动控制文件步骤
  9. 抓取epsg.io的内容
  10. class加载原理和Dex加载的原理-----android插件化技术