繁体   English   中英

如何查看可选项?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM