Java8 Stream 数值特化流

简介: Java8 Stream 数值特化流

一、 数值流



  • 在操作数值流的过程中,其实隐藏着一个问题: 装箱成本,每个原始类型都必须装箱成一个包装类型,如:

Stream<Integer> integerStream = Stream.of(1, 2, 3);
Integer sum = integerStream.reduce(0, Integer::sum);


二、 数值特化流(基本类型流)



  • 为了避免不必要的拆箱和装箱,Java8引入了三个原始类型特化流接口: IntStream, LongStreamDoubleStream,将流中的元素特化为int, longdouble,避免暗含的装箱成本。并且,在这三个特化接口中,提供了常用的数值规约方法,可以方便地进行数值相关的操作,如min, max, sum等。如果需要将基本类型特化流再转换成引用类型流,也有相应的方法支持。
  • 引用类型流映射成值类型流
  • 常用方法是mapToInt(), mapToLong()mapToDouble,以及flatMapToXxx...
  • 上述方法的返回值不再是Stream<T>,而是相应的数值类型流,如IntStream

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, OptionalLongOptionalDouble

// 注意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提供了可以作用于IntStreamLongStream的范围方法: range(start,end)rangeClose(start,end),区别是rangeClose()会包含end这个值。

// 生成1~100,并求和
System.out.println(IntStream.rangeClosed(1, 100).sum());


相关文章
|
10天前
|
安全 Java 大数据
|
13天前
|
SQL 存储 Java
java流式计算Stream
java流式计算Stream
11 0
|
23天前
|
Java API
掌握Java 8 Stream API的艺术:详解流式编程(三)
掌握Java 8 Stream API的艺术:详解流式编程
16 2
|
24天前
|
Oracle 架构师 Java
Java 22 新增利器: 使用 Java Stream Gather 优雅地处理流中的状态
本文中我们分析了 什么 是 “流”,对比了 Java 上几种常见的 “流”库,引入和详细介绍了 Java 22 中的 Stream Gather API 。同时也简单分享了利用虚拟线程 如何简化 Stream map Concurrent操作符的实现。希望抛砖引玉和大家分享新的特性,共同进步。同时也希望大家都可以升级到新版本的 JDK,更好的赋能业务。
|
10天前
|
Java Unix Windows
|
4天前
|
分布式计算 Java API
Java 8新特性之Lambda表达式与Stream API
【5月更文挑战第1天】本文将介绍Java 8中的两个重要特性:Lambda表达式和Stream API。Lambda表达式是一种新的函数式编程语法,可以简化代码并提高可读性。Stream API是一种用于处理集合的新工具,可以方便地进行数据操作和转换。通过结合Lambda表达式和Stream API,我们可以更加简洁高效地编写Java代码。
|
5天前
|
Java
Java8 Stream Collectors groupingBy使用
Java8 Stream Collectors groupingBy使用
|
8天前
|
Java API 开发者
【专栏】Java 8新特性之Stream API详解
【4月更文挑战第27天】Java 8的Stream API是处理集合数据的新方式,强调简洁和声明式编程。它基于延迟执行和惰性求值,提供创建、中间操作(如filter、map)和终端操作(如forEach、collect)。示例展示了如何通过Stream排序、过滤、映射和聚合数据。
|
9天前
|
Java 编译器 API
Java基础教程(17)-Java8中的lambda表达式和Stream、Optional
【4月更文挑战第17天】Lambda表达式是Java 8引入的函数式编程特性,允许函数作为参数或返回值。它有简洁的语法:`(parameters) -> expression 或 (parameters) ->{ statements; }`。FunctionalInterface注解用于标记单方法接口,可以用Lambda替换。
|
10天前
|
SQL Java
【java高级】stream流的基本用法(一)
【java高级】stream流的基本用法(一)
6 0