如何从 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);
我目前这样做:
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);