我正在看IntStream的文档,我看到一个toArray方法,但没有办法直接到List<Integer>
肯定有一种方法可以将流转换为列表?
我正在看IntStream的文档,我看到一个toArray方法,但没有办法直接到List<Integer>
肯定有一种方法可以将流转换为列表?
当前回答
您可以使用Eclipse collections中提供的原始集合,并避免装箱。
MutableIntList list =
IntStream.range(1, 5)
.collect(IntArrayList::new, MutableIntList::add, MutableIntList::addAll);
注意:我是Eclipse Collections的贡献者。
其他回答
您可以使用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);
}
注意:第三个参数仅当你想运行并行收集时才需要;对于顺序收集,只提供前两个就足够了。
找到以下使用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);
您还可以在流上使用mapToObj(),它接受一个IntFunction并返回一个对象值流,该流由将给定函数应用于该流的元素的结果组成。
List<Integer> intList = myIntStream.mapToObj(i->i).collect(Collectors.toList());
您可以使用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()