将 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>
用于将对象作为元素,三个原始流IntStream
、LongStream
、DoubleStream
用于主要的三个原语。如果您使用原语,请使用后者之一,在您的情况下为IntStream
。
看图:
背后的原因是:
Java generics 不能用于原始类型:可能只有 List<Integer>
和 Stream<Integer>
,但不能有 和 List<int>
s>Stream<int>
当Java Streams 框架被引入时,他们决定绕过这个开销,并行与“面向类”流(使用泛型机制),他们引入了三个额外的所有库函数集,专为最重要的原始类型设计:int
、long
、double
。
在这里也可以看到一个奇妙的解释:https://***.com/a/22919112/2886891
【讨论】:
以上是关于将 Streams 与原始数据类型和相应的包装器一起使用的主要内容,如果未能解决你的问题,请参考以下文章