我如何转换一个Java 8 IntStream到一个列表?

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

肯定有一种方法可以将Stream转换为List?

138505 次浏览

IntStream::boxed

IntStream::boxedIntStream转换为Stream<Integer>,然后你可以将collect转换为List:

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

boxed方法将IntStreamint基元值转换为Integer对象流。“boxing"这个词命名了intInteger转换过程。看到甲骨文教程

java16及以上版本

Java 16带来了更短的toList方法。产生一个无法改变的列表在这里讨论。

theIntStream.boxed().toList()

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

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

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

您还可以在流上使用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);
}

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