在使用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()
的行为也适用于包装类数组?
答案 0 :(得分:22)
Java 8流框架对象作为元素具有通用Stream<T>
,对于主要三个基元具有三个基本流IntStream
,LongStream
,DoubleStream
。如果您使用原语,请使用后者中的一个,在您的情况下IntStream
。
见图:
背后隐藏的是:
Java generics无法使用原始类型:可能只有List<Integer>
和Stream<Integer>
,但不能只有 和List<int>
Stream<int>
引入Java Collections框架时,它仅针对类引入,因此如果您想要List
int
,则必须将它们包装到Integer
秒。这很贵!
当Java Streams框架被引入时,他们决定绕过这个开销和并行与“面向类”的流(使用泛型机制),他们引入了三个额外的所有库函数集,专门为最重要的原始类型设计:int
,long
,double
。
此处还有一个奇妙的解释:https://stackoverflow.com/a/22919112/2886891