如何将Java 8 IntStream转换为列表?


283

我正在查看的文档,但IntStream看到了一种toArray方法,但是无法直接转到List<Integer>

当然有一种方法可以将a转换StreamList



2
@KarlRichter另一个问题没有给您键入列表。另外,这个问题来自四年前,答案为300多个。我们为什么现在尝试合并它?
埃里克·威尔逊

Answers:


541

IntStream::boxed

IntStream::boxedIntStream变成Stream<Integer>,然后可以将其collect变成List

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

boxed方法将的int原始值转换IntStreamInteger对象流。“装箱”一词称为intInteger转换过程。请参阅Oracle教程


1
@skiwi我的意思是,在此之后不需要所有其他答案,因为它们不是那么自然。
德米特里·金茨堡2014年

1
谢谢,我还没有看到盒装方法,它就像一个魅力。
twreid

另外:如果您使用的静态导入,我认为此代码会变得更短,更清晰,更漂亮toList。这是通过在文件导入中放置以下内容来完成的:static import java.util.stream.Collectors.toList;。然后,收集呼叫将读取为.collect(toList())
2016年

1
在Eclipse中,可以使IDE为方法添加静态导入。这是通过Collectors“首选项” ->“ Java” ->“ 编辑器” ->“ 内容辅助” ->“ 收藏夹”中添加类来完成的。在此之后,您只需要toLiCtr + Space处键入内容即可使IDE填写toList并添加静态导入。
2016年

2
我正在撕掉我尝试过的毛发的毛发,谢谢您指出这一boxed()部分
K Raphael

16

您还可以在Stream上使用mapToObj(),它接受一个I​​ntFunction并返回一个对象值的Stream,该对象值包括将给定函数应用于此流的元素的结果。

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

4
具有讽刺意味的是,这boxed()是委派的。
Makoto

9

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

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

注意:我是Eclipse Collections的撰稿人。


6
尽管Eclipse的集合通常是非常有帮助的,这看起来并不像它在所有:)做任何事情更容易

1
从EC 9.0开始,您可以从原始Stream构建一个原始列表。 MutableIntList list = IntLists.mutable.withAll(IntStream.range(1, 5))
唐纳德·拉布

1
这就是我想要的..将int流装到Integer或对象中是另一回事
Vikash19年

2

查找以下示例,使用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);

0

您可以使用collect方法:

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

实际上,这几乎就是您在对象流上调用.collect(Collectors.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);
}

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.