【问题标题】:How do I convert a Java 8 IntStream to a List?如何将 Java 8 IntStream 转换为列表?
【发布时间】:2014-07-03 16:29:50
【问题描述】:

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

肯定有办法将Stream 转换为List?

【问题讨论】:

  • @KarlRichter 另一个问题没有给你一个打字列表。此外,这个问题是四年前的问题,并且有 300 多个赞成票的答案。为什么我们现在要合并它?

标签: java java-8


【解决方案1】:

IntStream::boxed

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

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

boxed 方法将IntStream 的int 原始值转换为Integer 对象流。单词"boxing" 命名int ⬌ Integer 转换过程。见Oracle Tutorial。

Java 16 及更高版本

Java 16 带来了更短的 toList 方法。产生一个unmodifiable list。讨论here。

theIntStream.boxed().toList() 

【讨论】:

  • @skiwi 我的意思是,在这个答案之后不需要所有其他答案,因为它们不会那么自然。
  • 谢谢我还没有看到盒装方法,它就像一个魅力。
  • 补充:如果您使用toList 的静态导入,我认为这段代码会变得更短、更清晰、更漂亮。这是通过在文件的导入中放置以下内容来完成的:static import java.util.stream.Collectors.toList;。然后对方付费电话读取为.collect(toList())。
  • 在 Eclipse 中,可以让 IDE 为方法添加静态导入。这是通过在 Preferences -> Java -> Editor -> Content Assist 中添加 Collectors 类来完成的-> 收藏夹。之后,您只需在 Ctr+Space 处键入 toLi 即可让 IDE 填写 toList 并添加静态导入。
  • 对于我所尝试的方法出了什么问题,我大发雷霆,感谢您指出boxed() 部分
【解决方案2】:

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

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

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

【讨论】:

  • 虽然 Eclipse Collections 通常很有帮助,但这看起来并没有让任何事情变得更容易:)
  • 从 EC 9.0 开始,您可以从原始流构建原始列表。 MutableIntList list = IntLists.mutable.withAll(IntStream.range(1, 5))
  • 这就是我要找的.. 将 int 流装箱到整数或对象是不同的事情
【解决方案3】:

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

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

【讨论】:

  • 讽刺的是,这就是boxed() 的委托。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    你可以使用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);
    }
    

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

    【讨论】:

    • 最后一句话说明了一切。
    猜你喜欢
    • 1970-01-01
    • 2014-09-28
    • 2021-08-10
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    相关资源
    最近更新 更多