【问题标题】:How do I get an IntStream from a List<Integer>?如何从 List<Integer> 中获取 IntStream?
【发布时间】: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);
}

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

【问题讨论】:

标签: java collections java-8 java-stream boxing


【解决方案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);
}

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

【讨论】:

    猜你喜欢
    • 2022-06-10
    • 2017-02-22
    • 2020-02-20
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    相关资源
    最近更新 更多