为什么我的Java代码未被引用就提前执行了?
问题核心原因
Java的方法调用遵循先完成所有实参求值,再执行方法体逻辑的规则。你调用test方法时传入的第二、第三个参数是five.map(xxx)的执行结果,这两个map调用会在进入test方法的逻辑前就完成执行,所以不管test方法内部用不用这两个参数、返回什么结果,两个map里的打印逻辑都会被触发。你将test改为直接返回null时依然会打印两个日志,正是这个逻辑导致的。
修复方案
如果要实现分支逻辑按需执行,需要把参数从直接的Logger<T>实例改为惰性求值的提供者:
- 修改
test方法签名,接收Supplier类型的分支参数:
import java.util.function.Supplier; // 其余方法保持不变 public Logger<T> test(Predicate<? super T> pred, Supplier<Logger<T>> trueSupplier, Supplier<Logger<T>> falseSupplier) { if (pred.test(elem)) { return trueSupplier.get(); } else { return falseSupplier.get(); } }
- 调用
test方法时,将分支逻辑用lambda包裹为Supplier:
Logger<Integer> five = Logger.<Integer>of(5); five.map(x -> x + 1).test(x -> x == 5, // 只有true分支被匹配时才会执行内部逻辑 () -> five.map(x -> { System.out.println("add 1"); return x + 1; }), // 只有false分支被匹配时才会执行内部逻辑 () -> five.map(x -> { System.out.println("sub 1"); return x - 1; }));
修改后只有匹配到的分支逻辑会执行,输出结果和你的预期一致。
内容的提问来源于stack exchange,提问作者Heartless
相关产品推荐
相关产品推荐

