我假设问题中的用例只是一个糟糕的例子,因为它等同于以下语句:
name.setChecked(name.isChecked());
...这也没有意义。但是意图很明确,确实有很多相关的用例。
唯一可行且通用的解决方案是添加这样的辅助方法:
static void ternaryVoid(boolean condition, Runnable ifTrue, Runnable ifFalse) {
(condition ? ifTrue : ifFalse).run();
}
并像这样使用它:
ternaryVoid(name.isChecked(), () -> name.setChecked(true), () -> name.setChecked(false));
但它失去了三元运算符的优雅,只有在代码的多个部分使用并且纳秒无关紧要时才值得“努力”。
但这与 if-else 语句相比有什么意义呢?你真的要保存 7 个字符吗?
我很惊讶这样的陈述以反问的形式出现。是的,节省 4 行代码并使代码更优雅很重要,尤其是在函数式编程的上下文中。
此外,void 方法是否返回完整的Void 至少是有争议的。本质上,它们返回完成任务的通知。这就是为什么从逻辑上讲,三元表达式无论返回什么或什么都不返回都同样有意义:
condition ? doThis() : doThat();
下面是一个类的真实世界示例,它每秒可以处理数百万次增量更新:
public class DataHandler {
private final TreeMap<Integer, Long> tree = new TreeMap<>();
public void onUpdate(int price, long amount) {
if (amount == 0) {
tree.remove(price);
} else {
tree.put(price, amount);
}
}
}
如果允许,onUpdate() 方法将是一个不错的三元表达式,如下所示:
public void onUpdate(int price, long amount) {
(amount == 0) ? tree.remove(price) : tree.put(price, amount); // compilation error
}
幸运的是,在某些情况下,两个目标方法都返回值,并且这些值属于同一类型,在这种情况下为Long。这允许使onUpdate 方法在price 返回以前的amount(这甚至很有用)
public Long onUpdate(int price, long amount) {
return (amount == 0) ? tree.remove(price) : tree.put(price, amount);
}
...或者(例如,如果方法由接口确定),使用虚拟变量并抑制其无用警告:
public void onUpdate(int price, long amount) {
@SuppressWarnings("unused")
Long dummy = (amount == 0) ? tree.remove(price) : tree.put(price, amount);
}
否则,这些解决方案不适用,并且正如其他人所回答的那样,不存在。例如,可以尝试以下方法:
Consumer<Void> dummy = (x) -> {};
dummy.accept(/*...*/);
但有趣的是,第二行编译时既没有任何东西也没有任何东西作为参数。
似乎最好的通用解决方案是上面的辅助方法ternaryVoid()。