如何从 List<Integer> 中获取 IntStream?

Posted

技术标签:

【中文标题】如何从 List<Integer> 中获取 IntStream?【英文标题】:How do I get an IntStream from a List<Integer>? 【发布时间】:2014-08-29 07:29:24 【问题描述】:

我可以想到两种方法:

public static IntStream foo(List<Integer> list)

    return list.stream().mapToInt(Integer::valueOf);


public static IntStream bar(List<Integer> list)

    return list.stream().mapToInt(x -> x);

什么是惯用的方式?也许已经有一个库函数可以完全满足我的要求?

【问题讨论】:

另一种可能的方式是use flatMapToInt along with Instream.of 【参考方案1】:

我猜(或者至少是另一种选择)这种方式性能更高:

public static IntStream baz(List<Integer> list)

    return list.stream().mapToInt(Integer::intValue);

因为函数Integer::intValueToIntFunction 完全兼容,因为它接受Integer 并返回int。没有执行autoboxing。

我也在寻找Function::identity的等价物,我希望写一个等价于你的bar方法:

public static IntStream qux(List<Integer> list)

    return list.stream().mapToInt(IntFunction::identity);

但他们没有提供这种identity 方法。不知道为什么。

【讨论】:

大声笑,我把Integer::valueOfInteger::intValue 混淆了。我建议的函数foo 将列表中的整数拆箱以将其传递给valueOf,然后将其返回到一个框中,然后将其拆箱再次放入流中:) @shmosel 因为intValue没有自动装箱 什么自动装箱?在 lambda 版本中,x 已经是一个整数(来自列表),并且“返回 x”使用 intValue 将其隐式_un_boxes _un_boxes。我怀疑这种差异一开始会非常小,到 JIT 完成后会变得更小。 @yshavit 更不用说恒等函数也会做同样的事情。 @VictorZamanian - 那里没有拳击。该值在列表中以Integer 开头,然后传递给ToIntFunction.applyAsInt(T value),它接受一个对象并返回int,因此在调用它时没有将Integer 转换为T 的装箱。然后 lambda 函数 x -&gt; x 接受 Integer x 并返回它,这意味着它被取消装箱以符合 int 返回类型。没有进一步的装箱或拆箱。更喜欢Integer::intValue 的一个正当理由是没有创建额外的 lambda 函数 - 可以直接使用方法引用。【参考方案2】:

另一种转换方式是使用Stream.flatMapToIntIntStream.of 作为:

public static IntStream foobar(List<Integer> list) 
    return list.stream().flatMapToInt(IntStream::of);

注意:在此处发布之前,我浏览了几个链接的问题,但我也找不到其中的建议。

【讨论】:

以上是关于如何从 List<Integer> 中获取 IntStream?的主要内容,如果未能解决你的问题,请参考以下文章

java List<Object[]> 如何数据去重

有A和B两个顺序表,数据都为从小到大排列,如何把它们合并从一个顺序表C

如何对 List<Integer> 进行排序? [复制]

java如何从List中取值

如何在 Java 中将 int[] 转换为 List<Integer>?

将 List<List<Integer>> 转换为 int[][]