如何从 Set<Integer> 创建 IntStream?

How do I create IntStream from Set<Integer>?

我目前这样做:

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

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

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

IntStream intStream = integers.stream().asIntStream();

但是,没有什么可以阻止您为 Stream<String> 调用此类方法。 Java 中没有办法只为特定的通用参数启用调用方法。因此在另一种类型的流上意外调用它会编译得很好,但会导致运行时异常,这在静态类型语言中是很糟糕的。但是使用 .mapToInt(value -> value).mapToInt(Integer::intValue) 你强制类型检查:你必须提供一个 returns 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);