如何从Set <Integer>创建IntStream?

Ste*_*eod 9 java java-8 java-stream

我目前这样做:

Set<Integer> integers = ... // sourced from elsewhere in code
IntStream intStream = integers.stream().mapToInt(value -> value);
Run Code Online (Sandbox Code Playgroud)

将值映射到值,将转换为Stream<Integer>to 似乎是多余的IntStream.有没有办法在没有冗余mapToInt(...)部分的情况下做到这一点?

Tag*_*eev 8

不,你必须使用.mapToInt(value -> value)或(对我来说更好).mapToInt(Integer::intValue).由于Stream是通用类,它应该适用于任何通用流元素类型,因此它不可能添加一些简单的API的类型安全方式.例如,考虑接口中有asIntStream()方法Stream.它看起来肯定会更好:

IntStream intStream = integers.stream().asIntStream();
Run Code Online (Sandbox Code Playgroud)

但是,没有什么能阻止你为这种方法调用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

并使用它

IntStream intStream = Streams.intStream(integers);
Run Code Online (Sandbox Code Playgroud)