如何从Set <integer>创建IntStream?

时间:2015-08-21 10:51:40

标签: java java-8 java-stream

我目前这样做:

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

将值映射到值,将Stream<Integer>转换为IntStream似乎是多余的。有没有办法在没有多余mapToInt(...)部分的情况下执行此操作?

1 个答案:

答案 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);