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

ifl*_*oop 20 java wrapper primitive-types java-8 java-stream

在玩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
Run Code Online (Sandbox Code Playgroud)


我的问题: 这是为什么?这是否与例如行为Arrays.asList()也适用于包装类数组相关?

Hon*_*dek 25

爪哇8流框架有一个通用Stream<T>的对象作为元素,以及三个原始流IntStream,LongStream,DoubleStream对三个主要的原语.如果你使用原语,在你的情况下使用后者中的一个IntStream.

看图:

在此输入图像描述

背后的是:

  1. Java泛型不能使用基本类型的工作:有可能只有List<Integer>Stream<Integer>,但不List<int>Stream<int>

  2. Java集合引入框架,据介绍只有上课,所以如果你想拥有ListintS,你必须给他们换到Integer秒.这很贵!

  3. Java Streams框架被引入时,他们决定绕过这个开销并与"面向类的"流(使用泛型机制)并行,他们引入了三个额外的所有库函数集,专门为最重要的基本类型:int,long,double.

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