[英]How to peek on an Optional?
我想使用Optional
的流畅api并将两个Consumer
应用于它。
我在梦想这样的事情:
Optional.ofNullable(key)
.map(Person::get)
.ifPresent(this::printName)
.ifPresent(this::printAddress); // not compiling, because ifPresent is void
如何将多个Consumer
应用于Optional
?
以下是如何为Optional
实现缺少的peek
方法:
<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));
您可以使用以下语法:
ofNullable(key)
.map(Person::get)
.map(x -> {printName(x);return x;})
.map(x -> {printAddress(x);return x;});
虽然这看起来可能不太优雅,但我只想将两种方法合并为一个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));
也许是这样的:
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();
}
使用JDK9中的Optional API中的新流方法,您可以调用stream
方法从Optional<T>
为Stream<T>
,然后启用一个peek
,然后如果要返回Optional<T>
只需调用findFirst()
或findAny()
。
你的案例中的一个例子:
Optional.ofNullable(key)
.map(Person::get) // Optional<Person>
.stream() // Stream<Person>
.peek(this::printName)
.peek(this::printAddress)
...
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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.