【问题标题】:Using Streams with primitives data types and corresponding wrappers将 Streams 与原始数据类型和相应的包装器一起使用
【发布时间】: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 很高兴知道。谢谢
  • stackoverflow.com/q/14850879/2886891相关(但不直接复制)

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


【解决方案1】:

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

看图:

背后的原因是:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 2018-06-26
    • 2010-12-06
    相关资源
    最近更新 更多