是否有类可选但非选项类?

Lar*_*sen 42 java optional java-8

声明函数来映射值并在它们存在时使用它们是很方便的.

在你有几个强制对象和几个Optionals的情况下,我发现自己将其他包装在Optional.of(mandatoryObject)中,所以我可以在它们上使用相同的表达式而不用向后写它们.

Food vegetables = Food.someVegetables();
Optional<Food> condiment = Food.someCondiment();
Optional<Food> spices = Food.someSpices();

condiment.map(prepare).ifPresent(putOnPlate);
spices.map(prepare).ifPresent(putOnPlate);
Run Code Online (Sandbox Code Playgroud)

但后来我不喜欢这段代码:

putOnPlate.accept(prepare.apply(vegetables));
Run Code Online (Sandbox Code Playgroud)

所以我把它包起来:

Optional.of(vegetables).map(prepare).ifPresent(putOnPlate);
Run Code Online (Sandbox Code Playgroud)

但这是错误的,因为蔬菜(在这个例子中)实际上不是可选的.它们非常重要,我给大家的印象是它们是可选的.

所以我的问题是:java中有一些类如java.util.Mandatory,所以我可以写:

Mandatory.of(vegetables).map(prepare).definitelyPresentSo(putOnPlate);
Run Code Online (Sandbox Code Playgroud)

Hol*_*ger 27

是的,有这样的API.你可以替换

Optional.of(vegetables).map(prepare).ifPresent(putOnPlate);
Run Code Online (Sandbox Code Playgroud)

Stream.of(vegetables).map(prepare).forEach(putOnPlate);
Run Code Online (Sandbox Code Playgroud)

现在不得不忍受单元素Stream是任意元素流(包括可能的空流)的特殊情况.

但是您可以一次处理所有必需元素

Stream.of(mandatory1, mandatory2, mandatory3 /* etc */).map(prepare).forEach(putOnPlate);
Run Code Online (Sandbox Code Playgroud)

甚至可以合并可选元素,但它不会像它应该那样方便,Optional.stream()直到Java 9才会引入.

  • @pivovarit:你可以这样看,但`Optional`只支持`Stream`操作的一部分.另一方面,它有`get()`方法来检索它的唯一元素,而`Stream`对应的是`findAny()`,它将返回一个`Optional` ... (7认同)
  • @pivovarit:当然,`Optional`和`Stream`都是同一概念的特化(即使它们没有实现`Iterable`),但它可能引起长时间的争论,无论Optional是一个特殊的Stream还是Stream是一个扩展的Optional,但从技术上讲,`Optional`和`Stream`是不同的类,没有公共接口,也不是`java.lang.Object`以外的超类 - 不幸的是. (3认同)

Grz*_*rek 10

背后的主要思想Optional是抽象可空性(摆脱空检查)并提供一个流畅的API来处理可选值.

在一个始终存在的值的情况下,没有任何东西可以抽象(至少没有任何实际值),因此纯Java中不存在这样的工具.

在其他功能语言中,您有多个"monadic"工具,Optional可用于不同的用例.如果你想把它们带到Java,Javaslang可能是最好看的地方.你可以发现有工具,如Option,Try,Lazy,Validation,Either,Future,Tuple和整个Collections API允许编码,你所描述的类似的方式.