是否有 class 类似 Optional 但用于非 optionals?
Is there a class like Optional but for non-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);
但是我不喜欢这段代码:
putOnPlate.accept(prepare.apply(vegetables));
所以我把它包起来:
Optional.of(vegetables).map(prepare).ifPresent(putOnPlate);
但这是错误的,因为蔬菜(在这个例子中)实际上不是可选的。它们非常重要,我只是给大家一个印象,它们是可有可无的。
所以我的问题是:在 java 中是否有一些 class 像 java.util.Mandatory 这样我可以写:
Mandatory.of(vegetables).map(prepare).definitelyPresentSo(putOnPlate);
Optional
背后的主要思想是抽象可空性(摆脱空检查)并提供流畅的 API 来处理可选值。
在价值始终存在的情况下,没有什么可以抽象的(至少没有任何实用价值),所以在纯粹的 Java.
中不存在这样的工具
在其他函数式语言中,您有多个 'monadic' 工具,例如 Optional
可用于不同的用例。如果你想把它们带到 Java,Javaslang 可能是最好看的地方。你可以找到 Option
、Try
、Lazy
、Validation
、Either
、Future
、Tuple
等工具Collections API
允许以您描述的类似方式进行编码。
我可能是错的,但如果您不喜欢使用 Optional
,您可以只使用一个对象的 Stream
。所以而不是
Optional.of(vegetables).map(prepare).ifPresent(putOnPlate);
你可以只使用:
Stream.of(vegetables).map(prepare).forEach(putOnPlate);
结果将是相同的。如果蔬菜为空,这两种方法都会抛出 NPE
。
Arrays.asList(10, null).forEach(value -> {
Optional.of(value).map(x -> x.toString()).ifPresent(System.out::println);
Stream.of(value).map(x -> x.toString()).forEach(System.out::println);
});
NPE 安全版本即将发布
Optional.ofNullable(value).map(x -> x.toString()).ifPresent(System.out::println);
Stream.of(value).filter(Objects::nonNull).map(x -> x.toString()).forEach(System.out::println);
Optional
只是一个对象的容器,它可能包含也可能不包含非空值。
是的,有这么一个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);
甚至可以合并可选元素,但不会像应该的那样方便,因为 Optional.stream()
将在 Java 9 之前引入。
您似乎在寻找类型 @NonNull Food
。
声明函数以映射值并在存在时使用它们很方便。
在你有几个强制对象和几个可选对象的情况下,我发现自己也将其他对象包装在 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);
但是我不喜欢这段代码:
putOnPlate.accept(prepare.apply(vegetables));
所以我把它包起来:
Optional.of(vegetables).map(prepare).ifPresent(putOnPlate);
但这是错误的,因为蔬菜(在这个例子中)实际上不是可选的。它们非常重要,我只是给大家一个印象,它们是可有可无的。
所以我的问题是:在 java 中是否有一些 class 像 java.util.Mandatory 这样我可以写:
Mandatory.of(vegetables).map(prepare).definitelyPresentSo(putOnPlate);
Optional
背后的主要思想是抽象可空性(摆脱空检查)并提供流畅的 API 来处理可选值。
在价值始终存在的情况下,没有什么可以抽象的(至少没有任何实用价值),所以在纯粹的 Java.
中不存在这样的工具在其他函数式语言中,您有多个 'monadic' 工具,例如 Optional
可用于不同的用例。如果你想把它们带到 Java,Javaslang 可能是最好看的地方。你可以找到 Option
、Try
、Lazy
、Validation
、Either
、Future
、Tuple
等工具Collections API
允许以您描述的类似方式进行编码。
我可能是错的,但如果您不喜欢使用 Optional
,您可以只使用一个对象的 Stream
。所以而不是
Optional.of(vegetables).map(prepare).ifPresent(putOnPlate);
你可以只使用:
Stream.of(vegetables).map(prepare).forEach(putOnPlate);
结果将是相同的。如果蔬菜为空,这两种方法都会抛出 NPE
。
Arrays.asList(10, null).forEach(value -> {
Optional.of(value).map(x -> x.toString()).ifPresent(System.out::println);
Stream.of(value).map(x -> x.toString()).forEach(System.out::println);
});
NPE 安全版本即将发布
Optional.ofNullable(value).map(x -> x.toString()).ifPresent(System.out::println);
Stream.of(value).filter(Objects::nonNull).map(x -> x.toString()).forEach(System.out::println);
Optional
只是一个对象的容器,它可能包含也可能不包含非空值。
是的,有这么一个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);
甚至可以合并可选元素,但不会像应该的那样方便,因为 Optional.stream()
将在 Java 9 之前引入。
您似乎在寻找类型 @NonNull Food
。