Java 8可选*值的操作.

sik*_*iki 12 java java-8

Java的8有许多可选类,像OptionalDouble,OptionalInt,OptionalLong.

是否有一种很好的操作方式与相同类型的可选值?也就是说,我希望能够做到:

OptionalDouble d1 = OptionalDouble.of(1.);
OptionalDouble d2 = OptionalDouble.of(2.);
OptionalDouble d3 = OptionalDouble.of(3.);

OptionalDouble result = d1.add(d2).multiply(d3);
Run Code Online (Sandbox Code Playgroud)

当然,如果它们中的任何一个"空",结果应该是空的.在谷歌搜索了一下后,我发现了一些代码示例,人们正在使用这些函数(例如add),但它不是API的一部分(不再是?).

Stu*_*rks 5

的主要目的Optional是表示函数可能不存在的返回值

流的原始专业化的目的是避免装箱/拆箱开销。和OptionalInt朋友一起,存在不可避免的装箱级别(如果它们不存在,情况会更糟,因为替代方案是Optional<Integer>),但其目的是让处理返回值的人立即将其拆箱(或提供默认值或抛出一个如果不存在则例外),然后从那时起处理实际的原语。

支持所有附加 API 对可选原语进行算术、比较等操作会增加 API 的臃肿程度。使用它会导致代码混乱、缓慢,与 Java 中已经存在的完美的算术表达式语法相比,这是一个相当大的缺点。简而言之,在可选原语上添加一堆操作被认为是没有用的。


Jef*_*rey 4

诡异的。该参考文献Optional有一个map方法,您可以使用该方法执行与您想要的类似的操作,但它似乎在原始选项中不存在。我相信您目前唯一的办法是使用OptionalDouble::isPresentor OptionalDouble::ifPresent

或者您可以定义自己的辅助add方法或定义自己的OptionalDouble类来包含这些方法。

  • `Optional#Map` 似乎需要一个 `Function`,而不是一个 `BinaryOperator`,因此它只能用于对一个值进行操作的函数,而不是像 `add` 或 `multiply` 这样的函数。 (2认同)