我正在看IntStream的文档,我看到一个toArray方法,但没有办法直接到List<Integer>

肯定有一种方法可以将流转换为列表?


当前回答

IntStream:盒装

IntStream::boxed将IntStream转换为Stream<Integer>,然后将其收集到List中:

theIntStream.boxed().collect(Collectors.toList())

boxed方法将IntStream的int基元值转换为Integer对象的流。单词“boxing”将int命名为⬌整数转换过程。参见Oracle教程。

java16及以上版本

Java 16带来了更短的toList方法。产生一个不可修改的列表。这里讨论。

theIntStream.boxed().toList() 

其他回答

您还可以在流上使用mapToObj(),它接受一个IntFunction并返回一个对象值流,该流由将给定函数应用于该流的元素的结果组成。

List<Integer> intList = myIntStream.mapToObj(i->i).collect(Collectors.toList());

找到以下使用Java 8查找每个int元素的平方的示例:-

IntStream ints = Arrays.stream(new int[] {1,2,3,4,5});       
List<Integer> intsList = ints.map(x-> x*x)
          .collect(ArrayList<Integer>::new, ArrayList::add, ArrayList::addAll);

您可以使用collect方法:

IntStream.of(1, 2, 3).collect(ArrayList::new, List::add, List::addAll);

事实上,当你在对象流上调用.collect(collections . tolist())时,这几乎就是Java所做的:

public static <T> Collector<T, ?, List<T>> toList() {
    return new Collectors.CollectorImpl(ArrayList::new, List::add, (var0, var1) -> {
        var0.addAll(var1);
        return var0;
    }, CH_ID);
}

注意:第三个参数仅当你想运行并行收集时才需要;对于顺序收集,只提供前两个就足够了。

您可以使用Eclipse collections中提供的原始集合,并避免装箱。

MutableIntList list = 
    IntStream.range(1, 5)
    .collect(IntArrayList::new, MutableIntList::add, MutableIntList::addAll);

注意:我是Eclipse Collections的贡献者。

IntStream:盒装

IntStream::boxed将IntStream转换为Stream<Integer>,然后将其收集到List中:

theIntStream.boxed().collect(Collectors.toList())

boxed方法将IntStream的int基元值转换为Integer对象的流。单词“boxing”将int命名为⬌整数转换过程。参见Oracle教程。

java16及以上版本

Java 16带来了更短的toList方法。产生一个不可修改的列表。这里讨论。

theIntStream.boxed().toList()