我目前这样做:
Set<Integer> integers = ... // sourced from elsewhere in code
IntStream intStream = integers.stream().mapToInt(value -> value);
将值映射到值,将Stream<Integer>
转换为IntStream
似乎是多余的。有没有办法在没有多余mapToInt(...)
部分的情况下执行此操作?
答案 0 :(得分:8)
不,你必须使用.mapToInt(value -> value)
或(看起来更好).mapToInt(Integer::intValue)
。由于Stream
是泛型类,它应该适用于任何通用流元素类型,因此不可能以类型安全的方式向API添加更简单的内容。例如,考虑asIntStream()
接口中有Stream
方法。它看起来肯定会更好:
IntStream intStream = integers.stream().asIntStream();
但是没有什么可以阻止你为Stream<String>
调用这样的方法。 Java中没有办法只启用为特定泛型参数调用方法。因此,在另一种类型的流上意外调用它将编译正常,但会导致运行时异常,这在静态类型语言中是不好的。但是,使用.mapToInt(value -> value)
或.mapToInt(Integer::intValue)
强制进行类型检查:您必须提供一个返回int
的函数,因此stringStream.mapToInt(value -> value)
会正确报告编译错误。
如果您真的在意,可以在项目中自由创建静态方法,如下所示:
public class Streams {
public static IntStream intStream(Collection<Integer> c) {
return c.stream().mapToInt(Integer::intValue);
}
}
并像
一样使用它IntStream intStream = Streams.intStream(integers);