将 Streams 与原始数据类型和相应的包装器一起使用

Posted

技术标签:

【中文标题】将 Streams 与原始数据类型和相应的包装器一起使用【英文标题】:Using Streams with primitives data types and corresponding wrappers 【发布时间】:2014-05-25 07:17:40 【问题描述】:

在使用 Java8 的 Streams-API 时,我偶然发现了以下问题:

要将原始包装类对象数组转换为Stream,我只需调用Stream.of(array)。但是要转换原始数据类型的数组,我必须从相应的包装器(类)流类中调用.of(array)

一个例子:

final Integer[] integers = 1, 2, 3;
final int[]     ints     = 1, 2, 3;


Stream.of(integers).forEach(System.out::println); //That works just fine

Stream.of(ints).forEach(System.out::println);     //That doesn't

IntStream.of(ints).forEach(System.out::println);  //Have to use IntStream instead

我的问题: 为什么是这样?这是否与例如相关? Arrays.asList() 的行为也仅适用于包装类数组?

【问题讨论】:

用IntStream方法处理IntStreams,用Stream方法处理Streams不是很正常吗? 你也可以使用Arrays.stream(ints).forEach(System.out::println) @skiwi 很高兴知道。谢谢 与***.com/q/14850879/2886891相关(但不直接复制) 【参考方案1】:

Java 8 流框架有一个通用的Stream<T> 用于将对象作为元素,三个原始流IntStreamLongStreamDoubleStream 用于主要的三个原语。如果您使用原语,请使用后者之一,在您的情况下为IntStream

看图:

背后的原因是:

    Java generics 不能用于原始类型:可能只有 List<Integer>Stream<Integer>,但不能有 List<int>Stream<int>s>

    1234563这很昂贵!

    当Java Streams 框架被引入时,他们决定绕过这个开销,并行与“面向类”流(使用泛型机制),他们引入了三个额外的所有库函数集,专为最重要的原始类型设计:intlongdouble

在这里也可以看到一个奇妙的解释:https://***.com/a/22919112/2886891

【讨论】:

以上是关于将 Streams 与原始数据类型和相应的包装器一起使用的主要内容,如果未能解决你的问题,请参考以下文章

Java 数据库 ID - 原始类型或包装类型 [重复]

何时使用包装类和原始类型

Java中String与数组基本数据类型等的转换

Java中String与数组基本数据类型等的转换

Java中String与数组基本数据类型等的转换

JavaScript - 原始值包装类型