且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Java 8 的 Optional.ifPresent 和 if-not-Present 的功能风格?

更新时间:2022-03-04 17:11:00

对我来说@Dane White 的答案是可以的,首先我不喜欢使用 Runnable 但我找不到任何替代方案.

For me the answer of @Dane White is OK, first I did not like using Runnable but I could not find any alternatives.

这是我更喜欢的另一个实现:

Here another implementation I preferred more:

public class OptionalConsumer<T> {
    private Optional<T> optional;

    private OptionalConsumer(Optional<T> optional) {
        this.optional = optional;
    }

    public static <T> OptionalConsumer<T> of(Optional<T> optional) {
        return new OptionalConsumer<>(optional);
    }

    public OptionalConsumer<T> ifPresent(Consumer<T> c) {
        optional.ifPresent(c);
        return this;
    }

    public OptionalConsumer<T> ifNotPresent(Runnable r) {
        if (!optional.isPresent()) {
            r.run();
        }
        return this;
    }
}

那么:

Optional<Any> o = Optional.of(...);
OptionalConsumer.of(o).ifPresent(s -> System.out.println("isPresent " + s))
                .ifNotPresent(() -> System.out.println("! isPresent"));

更新 1:

当您拥有价值并想要处理它时,传统开发方式的上述解决方案但是如果我想定义功能并且执行将然后,请检查以下增强;

the above solution for the traditional way of development when you have the value and want to process it but what if I want to define the functionality and the execution will be then, check below enhancement;

public class OptionalConsumer<T> implements Consumer<Optional<T>> {
private final Consumer<T> c;
private final Runnable r;

public OptionalConsumer(Consumer<T> c, Runnable r) {
    super();
    this.c = c;
    this.r = r;
}

public static <T> OptionalConsumer<T> of(Consumer<T> c, Runnable r) {
    return new OptionalConsumer(c, r);
}

@Override
public void accept(Optional<T> t) {
    if (t.isPresent()) {
        c.accept(t.get());
    }
    else {
        r.run();
    }
}

然后可以用作:

Consumer<Optional<Integer>> c = OptionalConsumer.of(
    System.out::println, 
    () -> System.out.println("Not fit")
);

IntStream.range(0, 100)
    .boxed()
    .map(i -> Optional.of(i)
    .filter(j -> j % 2 == 0))
    .forEach(c);

在这个新代码中,你有 3 件事:

In this new code you have 3 things:

  1. 可以在对象存在之前轻松定义功能.
  2. 不要为每个 Optional 创建对象引用,只有一个,你的内存比更少的 GC 少得多.
  3. 它正在实现消费者以更好地与其他组件一起使用.

顺便说一下,现在它的名称更具描述性,它实际上是 Consumer>

By the way, now its name is more descriptive it is actually Consumer<Optional<?>>