对于Java代码中常见的if-else if-else比较繁琐,那在lambda场景下如何实现链式调用呢。
public class OptionalCondition{ private final T value; private OptionalCondition(final T value) { this.value = value; } public static OptionalCondition of(T obj) { return new OptionalCondition<>(obj); } public static OptionalCondition of(Supplier supplier) { return new OptionalCondition<>(supplier.get()); } public Then when(Function condition) { return new Then<>(condition, this.value); } public static class Then { private Function condition; private T value; Then(Function condition, final T value) { this.condition = condition; this.value = value; } public Else then(Consumer consumer) { if (condition.apply(this.value)) { consumer.accept(value); return NOOP_ELSE; } else { return new Else<>(value); } } } public static class Else { private final T value; Else(final T value) { this.value = value; } public Then elseWhen(Function condition) { return new Then<>(condition, this.value); } public void orElse(Consumer consumer) { if (null != consumer) { consumer.accept(value); } } } private static final Else NOOP_ELSE = new NoopElse(); private static final Then NOOP_THEN = new Then(null, null) { @Override public Else then(Consumer consumer) { return NOOP_ELSE; } }; public static class NoopElse extends Else { NoopElse() { super(null); } @Override public final void orElse(Consumer consumer) { } @Override public final Then elseWhen(Function condition) { return NOOP_THEN; } } }
测试类:
public class TestOptional {
@Test
public void test(){
OptionalCondition.of("1234").when(val-> Objects.equals("123", val))
.then(val -> System.out.println("then " + val))
.elseWhen(val-> Objects.equals("1234", val))
.then(val -> System.out.println("elseWhen " + val))
.elseWhen(val-> Objects.equals("12345", val))
.then(val -> System.out.println("elseWhen2 " + val));
// .orElse(val -> System.out.println("else " + val));
}
}



