在使用 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()
的行为也只适用于包装类数组?
最佳答案
Java 8 流框架有一个通用的 Stream<T>
对于作为元素的对象和三个原始流 IntStream
, LongStream
, DoubleStream
对于主要的三个原语。如果您使用基元,请使用后者之一,在您的情况下 IntStream
.
看图:
背后是:
Java generics不能使用原始类型:可能只有
List<Integer>
和Stream<Integer>
, 但不是List<int>
Stream<int>
当 Java Collections引入了框架,它只是为类引入的,所以如果你想拥有一个
List
的int
s,你必须将它们(每个元素!)包装到Integer
秒。这是昂贵的!当 Java Streams框架被引入后,他们决定绕过这个开销,并与“面向类”的流(使用泛型机制)并行,他们引入了三组额外的所有库函数,专门为最重要的原始类型:
int
,long
,double
.
顺便说一句,他们对 java.util.function 中的预定义功能接口(interface)做了同样的事情。包,所以你有Predicate
, IntPredicate
, DoublePredicate
, 和 LongPredicate
.
另请参阅此处的绝妙解释:https://stackoverflow.com/a/22919112/2886891
关于java - 将 Streams 与原始数据类型和相应的包装器一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23007422/