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

时间:2014-04-11 08:31:14

标签: java wrapper java-8 primitive-types java-stream

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

要将原始包装器classe对象的数组转换为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()的行为也适用于包装类数组?

1 个答案:

答案 0 :(得分:22)

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

见图:

enter image description here

背后隐藏的是:

  1. Java generics无法使用原始类型:可能只有List<Integer>Stream<Integer>,但不能只有 List<int> Stream<int>

  2. 引入Java Collections框架时,它仅针对类引入,因此如果您想要List int,则必须将它们包装到Integer秒。这很贵!

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

  4. 此处还有一个奇妙的解释:https://stackoverflow.com/a/22919112/2886891

相关问题