我可以不映射/平面映射可选Int吗?

2022-09-01 12:15:49

为什么在 OptionalInt 或其他原始可选风格上似乎没有 /方法?map()flatMap()

映射操作允许在对象和基元之间进行转换。但是,为什么 Optional 没有利用这一点呢?stream()

OptionalInt profileId = OptionalInt.of(124);

Optional<Profile> profile = profileId.map(i -> getProfile(i));  //no such valid map() method!

答案 1

基元可选选项在设计上没有映射平面映射筛选方法。

此外,根据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)

答案 2

在Java 9中,OptionalInt似乎有一个方法,可以给你一个包含0或1个元素的方法。在此流上,您当然可以使用 、或 等。streamIntStreammap()flatMap()filter()

对于Java 8,我没有任何东西可以添加到user2138356的答案中


推荐