Java8中用Lambda实现互斥ifExist/ifNotExist链式调用替代if-else
这个需求挺实用的,要实现这种链式互斥的ifExist/ifNotExist逻辑,核心是得有个「状态跟踪对象」帮我们记住有没有已经执行过其中一个分支,这样后续的分支就能根据这个状态决定要不要触发。我给你拆解下具体实现步骤:
实现方案:引入状态持有中间类
原来的ifExist方法返回void,没法支持链式调用,所以我们需要把它改成返回一个持有执行状态的中间对象,用这个对象来控制ifNotExist的执行逻辑。
1. 修改Element类,新增状态处理内部类
我们可以在Element类里定义一个内部的PresenceHandler类,用来保存当前Element实例和分支执行状态:
public class Element { // 你的原有exist()方法 public boolean exist() { // 替换成你的实际存在性判断逻辑 return false; } // 内部状态处理类:跟踪分支执行情况 public class PresenceHandler { private final Element element; private boolean hasExecutedBranch; private PresenceHandler(Element element, boolean executed) { this.element = element; this.hasExecutedBranch = executed; } // ifNotExist方法:仅当未执行过ifExist分支时才触发 public void ifNotExist(Consumer<Element> consumer) { // 双重校验:确保ifExist没执行过,且元素确实不存在 if (!hasExecutedBranch && !element.exist()) { consumer.accept(element); } } // 可选:重载无参数版本(如果else逻辑不需要Element实例) public void ifNotExist(Runnable runnable) { if (!hasExecutedBranch && !element.exist()) { runnable.run(); } } } // 修改原ifExist方法,返回PresenceHandler以支持链式调用 public PresenceHandler ifExist(Consumer<Element> consumer) { boolean elementExists = exist(); if (elementExists) { consumer.accept(this); } // 返回状态对象,标记是否执行过ifExist分支 return new PresenceHandler(this, elementExists); } }
2. 链式调用的使用方式
现在你就可以像期望的那样链式调用,而且两个分支是严格互斥的——只会执行其中一个:
Element element = new Element(); // 带Element参数的写法 element.ifExist(el -> { System.out.println("执行元素存在时的逻辑"); }).ifNotExist(el -> { System.out.println("执行元素不存在时的逻辑"); }); // 可选:无参数的简洁写法(如果不需要Element实例) element.ifExist(el -> { System.out.println("元素存在"); }).ifNotExist(() -> { System.out.println("元素不存在"); });
3. 互斥逻辑的核心原理
- 当调用
ifExist时,会先判断元素是否存在:如果存在,执行传入的Consumer,同时返回的PresenceHandler会标记hasExecutedBranch = true;如果不存在,标记hasExecutedBranch = false。 - 后续调用
ifNotExist时,会先检查hasExecutedBranch是否为false(也就是ifExist分支没执行过),同时再次确认元素确实不存在,才会执行对应的逻辑。 - 这样就从根本上保证了两个分支只会触发一个,不会出现同时执行的情况。
内容的提问来源于stack exchange,提问作者yelliver
相关产品推荐
相关产品推荐

