다른 해결책은 다음과 같습니다.
이것은 당신이 그것을 사용하는 방법입니다 :
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"));
또는 반대 사용 사례의 경우에 해당하는 경우 :
final Opt<String> opt = Opt.of("This is the text");
opt.ifNotPresent()
.apply(() -> System.out.println("Not present"))
.elseApply(t -> /*do something here*/);
이것은 재료입니다 :
- "elseApply"메소드만을위한 거의 수정 된 기능 인터페이스
- 선택적 향상
- 약간의 curring :-)
"화장품"강화 기능 인터페이스.
@FunctionalInterface
public interface Fkt<T, R> extends Function<T, R> {
default R elseApply(final T t) {
return this.apply(t);
}
}
그리고 향상을위한 선택적 래퍼 클래스 :
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);
}
}
이것은 트릭을 수행해야하며 이러한 요구 사항을 처리하는 방법을 기본 템플릿으로 사용할 수 있습니다.
기본 아이디어는 다음과 같습니다. 비 기능적 스타일의 프로그래밍 세계에서는 아마도 두 매개 변수를 사용하는 메서드를 구현할 것입니다. 첫 번째 매개 변수는 값을 사용할 수있는 경우 실행 해야하는 실행 가능한 코드의 종류이고 다른 매개 변수는 실행 가능한 코드입니다. 값을 사용할 수 없습니다. 가독성을 높이기 위해 curring을 사용하여 두 매개 변수의 기능을 한 매개 변수의 두 기능으로 각각 분할 할 수 있습니다. 이것이 기본적으로 내가 한 일입니다.
힌트 : Opt은 값을 사용할 수없는 경우를 대비하여 코드를 실행하려는 다른 사용 사례도 제공합니다. 이것은 Optional.filter.stuff를 통해서도 가능하지만 훨씬 더 읽기 쉽습니다.
희망이 도움이됩니다!
좋은 프로그래밍 :-)