另一个解决方案可能如下:
这是您的用法:
final Opt<String> opt = Opt.of("I'm a cool text");
opt.ifPresent()
.apply(s -> System.out.printf("Text is: %s\n", s))
.elseApply(() -> System.out.println("no text available"));
或者,如果您遇到相反的用例,则为true:
final Opt<String> opt = Opt.of("This is the text");
opt.ifNotPresent()
.apply(() -> System.out.println("Not present"))
.elseApply(t -> /*do something here*/);
这些是成分:
- 很少修改的Function接口,仅用于“ elseApply”方法
- 可选增强
- 一点点的:-)
“外观”增强的功能界面。
@FunctionalInterface
public interface Fkt<T, R> extends Function<T, R> {
default R elseApply(final T t) {
return this.apply(t);
}
}
以及用于增强功能的Optional包装器类:
public class Opt<T> {
private final Optional<T> optional;
private Opt(final Optional<T> theOptional) {
this.optional = theOptional;
}
public static <T> Opt<T> of(final T value) {
return new Opt<>(Optional.of(value));
}
public static <T> Opt<T> of(final Optional<T> optional) {
return new Opt<>(optional);
}
public static <T> Opt<T> ofNullable(final T value) {
return new Opt<>(Optional.ofNullable(value));
}
public static <T> Opt<T> empty() {
return new Opt<>(Optional.empty());
}
private final BiFunction<Consumer<T>, Runnable, Void> ifPresent = (present, notPresent) -> {
if (this.optional.isPresent()) {
present.accept(this.optional.get());
} else {
notPresent.run();
}
return null;
};
private final BiFunction<Runnable, Consumer<T>, Void> ifNotPresent = (notPresent, present) -> {
if (!this.optional.isPresent()) {
notPresent.run();
} else {
present.accept(this.optional.get());
}
return null;
};
public Fkt<Consumer<T>, Fkt<Runnable, Void>> ifPresent() {
return Opt.curry(this.ifPresent);
}
public Fkt<Runnable, Fkt<Consumer<T>, Void>> ifNotPresent() {
return Opt.curry(this.ifNotPresent);
}
private static <X, Y, Z> Fkt<X, Fkt<Y, Z>> curry(final BiFunction<X, Y, Z> function) {
return (final X x) -> (final Y y) -> function.apply(x, y);
}
}
这应该可以解决问题,并且可以作为如何处理此类要求的基本模板。
这里的基本思想如下。在非功能风格的编程世界中,您可能会实现一个带有两个参数的方法,其中第一个是一种可运行的代码,如果有可用值,则应执行该参数;另一个参数是可运行的代码,如果该参数可用,则应运行该代码。值不可用。为了提高可读性,您可以使用curr将两个参数的功能拆分为每个参数一个的两个功能。这基本上就是我在这里所做的。
提示:Opt还提供了另一种用例,在这种情况下您想执行一段代码以防万一该值不可用。也可以通过Optional.filter.stuff完成,但是我发现它更具可读性。
希望有帮助!
好的编程:-)