我可以不映射/ flatMap一个OptionalInt吗?

时间:2015-03-17 16:48:45

标签: java lambda java-8

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

stream()地图操作允许在对象和基元之间进行转换。但是为什么Optional不利用这个呢?

OptionalInt profileId = OptionalInt.of(124);

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

2 个答案:

答案 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