You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么我的Java代码未被引用就提前执行了?

问题核心原因

Java的方法调用遵循先完成所有实参求值,再执行方法体逻辑的规则。你调用test方法时传入的第二、第三个参数是five.map(xxx)的执行结果,这两个map调用会在进入test方法的逻辑前就完成执行,所以不管test方法内部用不用这两个参数、返回什么结果,两个map里的打印逻辑都会被触发。你将test改为直接返回null时依然会打印两个日志,正是这个逻辑导致的。

修复方案

如果要实现分支逻辑按需执行,需要把参数从直接的Logger<T>实例改为惰性求值的提供者:

  1. 修改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();
    }
}
  1. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 21:45:01