如何将Java 8 IntStream转换为List?

Eri*_*son 264 java java-8

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

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

Ian*_*rts 515

IntStream.boxed将a IntStream转换为a Stream<Integer>,然后您可以将其collect转换为列表:

theIntStream.boxed().collect(Collectors.toList())
Run Code Online (Sandbox Code Playgroud)

  • 我正在为我尝试过的东西出了什么问题而烦恼,感谢您指出“盒装()”部分 (2认同)

小智 16

您还可以在Stream上使用mapToObj(),它接受IntFunction并返回一个对象值Stream,其中包含将给定函数应用于此流元素的结果.

List<Integer> intList = myIntStream.mapToObj(i->i).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

  • 具有讽刺意味的是,这就是`boxed()`所委托的. (4认同)

Nik*_*kar 9

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

MutableIntList list = 
    IntStream.range(1, 5)
    .collect(IntArrayList::new, MutableIntList::add, MutableIntList::addAll);
Run Code Online (Sandbox Code Playgroud)

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

  • 尽管Eclipse Collections通常非常有用,但这看起来并不像是让它变得更容易:) (6认同)
  • 从 EC 9.0 开始,您可以从原始 Stream 构建原始列表。`MutableIntList 列表 = IntLists.mutable.withAll(IntStream.range(1, 5))` (2认同)
  • 这就是我一直在寻找的..将 int 流装箱为 Integer 或对象是不同的事情 (2认同)

Har*_*nes 5

您可以使用 collect 方法:

IntStream.of(1, 2, 3).collect(ArrayList::new, List::add, List::addAll);
Run Code Online (Sandbox Code Playgroud)

事实上,当你在对象流上调用 .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);
}
Run Code Online (Sandbox Code Playgroud)

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