我不能 map/flatMap 一个 OptionalInt 吗?
Can I not map/flatMap an OptionalInt?
为什么在 OptionalInt 或其他原始可选风格上似乎没有 map()
/flatMap()
方法?
stream()
映射操作允许对象和图元之间的转换。但是为什么 Optional 不利用这个?
OptionalInt profileId = OptionalInt.of(124);
Optional<Profile> profile = profileId.map(i -> getProfile(i)); //no such valid map() method!
原始可选值在设计上没有 map、flatMap 和 filter 方法。
此外,根据 Java8 in Action p.305,您不应该使用它们。
在流上使用原语的理由是性能原因。在元素数量巨大的情况下,boxing/unboxing 开销很大。但这是毫无意义的,因为 Optional.
中只有一个元素。
此外,考虑示例:
public class Foo {
public Optional<Integer> someMethod() {
return Optional.of(42);
}
}
以及作为方法参考的用法:
.stream()
.map(Foo::someMethod)
如果将 someMethod 的 return 类型更改为 OptionalInt:
public OptionalInt someMethod() {
return OptionalInt.of(42);
}
您不能将其用作方法参考,代码将无法编译:
.map(Foo::someMethod)
似乎在 Java 9 OptionalInt
中将有一个 stream
方法,它为您提供一个 IntStream
,其中包含 0 或 1 个元素。在此流中,您当然可以使用 map()
、flatMap()
或 filter()
等
对于Java8 我没有什么要补充的。
为什么在 OptionalInt 或其他原始可选风格上似乎没有 map()
/flatMap()
方法?
stream()
映射操作允许对象和图元之间的转换。但是为什么 Optional 不利用这个?
OptionalInt profileId = OptionalInt.of(124);
Optional<Profile> profile = profileId.map(i -> getProfile(i)); //no such valid map() method!
原始可选值在设计上没有 map、flatMap 和 filter 方法。
此外,根据 Java8 in Action p.305,您不应该使用它们。 在流上使用原语的理由是性能原因。在元素数量巨大的情况下,boxing/unboxing 开销很大。但这是毫无意义的,因为 Optional.
中只有一个元素。此外,考虑示例:
public class Foo {
public Optional<Integer> someMethod() {
return Optional.of(42);
}
}
以及作为方法参考的用法:
.stream()
.map(Foo::someMethod)
如果将 someMethod 的 return 类型更改为 OptionalInt:
public OptionalInt someMethod() {
return OptionalInt.of(42);
}
您不能将其用作方法参考,代码将无法编译:
.map(Foo::someMethod)
似乎在 Java 9 OptionalInt
中将有一个 stream
方法,它为您提供一个 IntStream
,其中包含 0 或 1 个元素。在此流中,您当然可以使用 map()
、flatMap()
或 filter()
等
对于Java8 我没有什么要补充的