我想使用Optional
的流畅api并对其应用两个Consumer
。
Optional.ofNullable(key)
.map(Person::get)
.ifPresent(this::printName)
.ifPresent(this::printAddress); // not compiling, because ifPresent is void
如何将多个Consumer
应用于Optional
?
答案 0 :(得分:11)
在这里,您可以为peek
实现缺少的Optional
方法:
<T> UnaryOperator<T> peek(Consumer<T> c) {
return x -> {
c.accept(x);
return x;
};
}
用法:
Optional.ofNullable(key)
.map(Person::get)
.map(peek(this::printName))
.map(peek(this::printAddress));
答案 1 :(得分:9)
虽然这可能看起来不太优雅,但我只想将两种方法合并为一个lambda
并将其传递给ifPresent
:
ofNullable(key)
.map(Person::get)
.ifPresent(x -> {printName(x); printAddress(x);});
或者,您也可以使用andThen
链接多个消费者,但这需要您将方法引用转换为Consumer
,这也不是很优雅。
ofNullable(key)
.map(Person::get)
.ifPresent(((Consumer) this::printName).andThen(this::printAddress));
答案 2 :(得分:8)
您可以使用以下语法:
ofNullable(key)
.map(Person::get)
.map(x -> {printName(x);return x;})
.map(x -> {printAddress(x);return x;});
答案 3 :(得分:3)
也许是这样的:
Optional.ofNullable(key)
.map(Person::get)
.ifPresent(combine(this::printAddress, this::printWish));
其中combine
是:
public <T> Consumer<T> combine(Consumer<T>... cs) {
return x -> Stream.of(cs).peek(c -> c.accept(x)).close();
}
答案 4 :(得分:2)
使用自JDK9起的Optional API中的新stream方法,您可以调用stream
方法从Optional<T>
转换为Stream<T>
,然后将其中一个转换为{ {1}},然后如果要返回到peek
,只需调用Optional<T>
或findFirst()
。
您的示例:
findAny()
答案 5 :(得分:1)
Java 8替代(map
+ orElseGet
):
Optional.ofNullable(key)
.map(Person::get) // Optional<Person>
.map(Stream::of) // Optional<Stream<Person>>
.orElseGet(Stream::empty) // Stream<Person>
.peek(this::printName)
.peek(this::printAddress)
.findAny();