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

tmn*_*tmn 23 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!
Run Code Online (Sandbox Code Playgroud)

fas*_*sth 9

原始选项没有设计map,flatMapfilter方法.

此外,根据Java8 in Action p.305,你不应该使用它们.在流上使用原语的理由是性能原因.在大量元素的情况下,装箱/拆箱开销很重要.但这是毫无意义的,因为Optional中只有一个元素.

此外,考虑例子:

public class Foo {
    public Optional<Integer> someMethod() {
        return Optional.of(42);
    }
}
Run Code Online (Sandbox Code Playgroud)

并用作方法参考:

.stream()
.map(Foo::someMethod)
Run Code Online (Sandbox Code Playgroud)

如果将someMethod的返回类型更改为OptionalInt:

public OptionalInt someMethod() {
    return OptionalInt.of(42);
}
Run Code Online (Sandbox Code Playgroud)

您不能将它用作方法参考,代码将无法编译:

.map(Foo::someMethod)
Run Code Online (Sandbox Code Playgroud)

  • 我没有看到你的例子.使用`someMethod`返回`OptionalInt`,你可以映射它,它会将`Stream <Foo>`转换为`Stream <OptionalInt>`(而不是在第一种情况下``Stream <Optional <Integer >>` ).性能论证也不成立."Stream"和"Optional"的操作也是关于组合的.我可以在`Stream`上`stream.reduce(binOp).map(fun)`,但我不能在`IntStream`上做.缺乏一致性令人讨厌.至少可能有一个`Optional <Integer> boxed()`就像在`IntStream`上一样...... (16认同)

Ole*_*.V. 6

在Java 9中似乎OptionalInt将有一个stream方法,它给你一个IntStream0或1元素.在这个流你当然可以使用map(),flatMap()filter()等.

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