是否有类似 Optional 但适用于非可选的类?

2022-09-01 01:39:54

将函数声明为映射值并使用它们(如果存在)非常方便。

在有几个强制对象和几个可选对象的情况下,我发现自己也把其他对象包装在 Optional.of(强制性对象)中,这样我就可以在它们上使用相同的表达式,而不必向后写。

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

condiment.map(prepare).ifPresent(putOnPlate);
spices.map(prepare).ifPresent(putOnPlate);

但是我不喜欢这个代码:

putOnPlate.accept(prepare.apply(vegetables));

所以我把它包起来:

Optional.of(vegetables).map(prepare).ifPresent(putOnPlate);

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

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

Mandatory.of(vegetables).map(prepare).definitelyPresentSo(putOnPlate);

答案 1

是的,有这样一个API。您可以替换

Optional.of(vegetables).map(prepare).ifPresent(putOnPlate);

Stream.of(vegetables).map(prepare).forEach(putOnPlate);

现在不得不忍受这样一个事实,即单元素是任意元素流(包括可能的空流)的特殊情况。Stream

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

Stream.of(mandatory1, mandatory2, mandatory3 /* etc */).map(prepare).forEach(putOnPlate);

甚至可以合并可选元素,但它不会像它应该的那样方便,因为Optimed.stream()将在Java 9之前引入。


答案 2

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

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

在其他函数式语言中,您有多个“monadic”工具,例如可用于不同的用例。如果你想把它们带到Java,Javaslang可能是最好的地方。你可以找到像、、、、、、和整体这样的工具,它们允许以你所描述的类似方式编码。OptionalOptionTryLazyValidationEitherFutureTupleCollections API


推荐