是否有像可选的类,但非可选项?

声明函数来映射值并消耗它们(如果存在的话)是很方便的。

在这种情况下,你有几个强制性对象和几个选项,我发现自己也包装在Optional.of(mandatoryObject)中,所以我可以在它们上使用相同的expression式而不用全部写回。

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.util.Mandatory java中的一些类,所以我可以写:

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

是的,有这样一个API。 你可以replace

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

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

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

但是你可以一次处理所有的强制性要素

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

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

背后的主要思想是提取可空性(摆脱空检查),并提供一个stream利的API处理可选的值。

在总是存在的值的情况下,没有什么可以抽象的(至less没有任何实际的值),所以在纯Java中不存在这样的工具。

在其他function语言中,您有多个“monadic”工具,如Optional用于不同的用例。 如果你想把它们带到Java, Javaslang可能是最好的地方看看。 你可以find像OptionTryLazyValidationEitherFutureTuple和整个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只是一个对象的容器,它可能包含或不包含非空值。

你似乎正在寻找@NonNull Food的types。