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

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

在使用 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 .

看图:

enter image description here

背后是:

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

  2. Java Collections引入了框架,它只是为类引入的,所以如果你想拥有一个 Listint s,你必须将它们(每个元素!)包装到 Integer秒。这是昂贵的!

  3. 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/

相关文章:

围绕生产脚本的 Perl 测试包装器

java - 如何在 Java 中搜索映射以查找与谓词匹配的键?

Java 8 流对具有 boolean 字段的元素执行某些操作

java - 在java中执行git blame命令

java - Wicket IFormValidator - 将多个 FormComponent 标记为无效

java - WEB-INF/jsp 中包含更多文件夹的 viewResolver 在 spring 中不起作用

java 8 在运行时找出元空间的大小

java - 为什么在将 Hibernate 5.2.8 与 JasperReports 6.4.0 一起使用时出现 java.lang.NoSuchMethodError

gd 的 php 包装器类

javascript - 包装函数的类 : get correct typings and access to number of arguments (in typescript)