我可以想到两种方法:
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);
}
什么是惯用方式?也许已经有一个库函数可以完全满足我的需求了吗?
我可以想到两种方法:
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);
}
什么是惯用方式?也许已经有一个库函数可以完全满足我的需求了吗?
我猜(或者至少这是一种替代方案),这种方式更加高效:
public static IntStream baz(List<Integer> list)
{
return list.stream().mapToInt(Integer::intValue);
}
由于函数Integer::intValue
与ToIntFunction
完全兼容,因为它接受一个Integer
并返回一个int
。不执行autoboxing。
我还在寻找Function::identity
的等效方法,希望编写与您的bar
方法等效的方法:
public static IntStream qux(List<Integer> list)
{
return list.stream().mapToInt(IntFunction::identity);
}
identity
方法。不知道为什么。Integer::valueOf
和Integer::intValue
。我提出的函数foo
将列表中的整数解封装为基本类型,然后将其传递给valueOf
方法进行包装,之后它又被封装成一个箱子,然后再次被解封装以放入流中 :) - fredoverflowintValue
不执行自动装箱。 - gontardInteger
类型的,然后传递给了ToIntFunction.applyAsInt(T value)
,该函数接受一个对象并返回int
类型,因此在调用它时不需要将Integer
转换为T
。然后,lambda函数x -> x
接受一个Integer x
并将其返回,这意味着它被取消装箱以符合int
返回类型。之后没有进一步的装箱或取消装箱操作。偏好使用 Integer :: intValue
的一个有效原因是不会创建额外的 lambda 函数 - 直接使用方法引用即可。 - BeeOnRope另一种转换方式是使用Stream.flatMapToInt
和IntStream.of
,代码如下:
public static IntStream foobar(List<Integer> list) {
return list.stream().flatMapToInt(IntStream::of);
}
注意:在发布此贴之前,我查看了几个相关问题的链接,但是没有找到这种建议。
flatMapToInt
和Instream.of
。 - NamanInteger::valueOf
是非常低效的。我想知道这样的事情在生产代码中有多常见。我曾经看到过一些不那么严重的装箱-拆箱的例子。 - Tom Hawtin - tackline