如何查看可选项?

时间:2017-05-02 11:54:12

标签: java optional

我想使用Optional的流畅api并对其应用两个Consumer

我梦想着这样的事情:

Optional.ofNullable(key)
    .map(Person::get)
    .ifPresent(this::printName)
    .ifPresent(this::printAddress); // not compiling, because ifPresent is void

如何将多个Consumer应用于Optional

6 个答案:

答案 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();