为什么OptionalInt或其他原始可选风格似乎没有map()
/ flatMap()
方法?
stream()
地图操作允许在对象和基元之间进行转换。但是为什么Optional不利用这个呢?
OptionalInt profileId = OptionalInt.of(124);
Optional<Profile> profile = profileId.map(i -> getProfile(i)); //no such valid map() method!
答案 0 :(得分:9)
原始选项无需设计地图, flatMap 和过滤器方法。
此外,根据Java8 in Action p.305,您不应该使用它们。 在流上使用原语的理由是性能原因。在大量元素的情况下,装箱/拆箱开销很重要。但这是毫无意义的,因为Optional中只有一个元素。
此外,请考虑示例:
public class Foo {
public Optional<Integer> someMethod() {
return Optional.of(42);
}
}
用作方法参考:
.stream()
.map(Foo::someMethod)
如果您将someMethod的返回类型更改为 OptionalInt :
public OptionalInt someMethod() {
return OptionalInt.of(42);
}
您不能将它用作方法参考,代码将无法编译:
.map(Foo::someMethod)
答案 1 :(得分:6)
似乎在Java 9 OptionalInt
中将有一个stream
方法,为您提供一个{0}或0或1个元素的IntStream
。在此信息流中,您当然可以使用map()
,flatMap()
或filter()
等。
对于Java 8,我无需添加user2138356’s answer。