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

Posted

技术标签:

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

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

肯定有办法将Stream 转换为List

【问题讨论】:

试试这个链接:***.com/questions/14830313/… @KarlRichter 另一个问题没有给你一个打字列表。此外,这个问题是四年前的问题,并且有 300 多个赞成票的答案。为什么我们现在要合并它? 【参考方案1】:

IntStream::boxed

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

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

boxed 方法将IntStreamint 原始值转换为Integer 对象流。单词"boxing" 命名intInteger 转换过程。见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);

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

【讨论】:

最后一句话说明了一切。

以上是关于如何将 Java 8 IntStream 转换为列表?的主要内容,如果未能解决你的问题,请参考以下文章

Java 8 将 int[][] 转换为 Integer[][] 的方法

如何使用 PANDAS / Python 将矩阵转换为列数组

用于 int 范围的 Java 8 IntStream?

无法将 IntStream 转换为某些对象流

如何将数据行转换为列?

将`IntStream`打印为`String`的最简单方法