我在想是否有可能进行三元操作,但不返回任何内容。
如果Java中不可能,那么其他语言是否可以实现,哪些语言适用?
name.isChecked() ? name.setChecked(true):name.setChecked(false);
不,你不能这样做。但是相较于使用 if-else
语句,这种做法有什么意义呢?你真的为了节省7个字符而这样做吗?
if (name.isChecked()) {
name.setChecked(true);
} else {
name.setChecked(false);
}
或者如果你喜欢不好的风格:
if (name.isChecked()) name.setChecked(true); else name.setChecked(false);
不要在意你可以仅仅使用以下方式(在这种情况下):
name.setChecked(name.isChecked());
三元运算符或“条件”运算符的用途是将条件引入一个表达式中。换句话说,这样写:
int max = a > b ? a : b;
这是缩写,意思等同于:
int max;
if ( a > b ) {
max = a;
} else {
max = b;
}
如果没有产生值,条件运算符就不是一种捷径。
someConditionTrue && doSideEffect()
中,有时你会看到这种情况。但是,像许多代码风格一样,这是高度主观的。 - Mark Petersname.setChecked(name.isChecked() ? true : false);
name.setChecked(name.isChecked());
我认为问题中的用例只是一个糟糕的例子,因为它等同于以下语句:
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
方法返回之前的amount
在price
时的值(这甚至是有用的)。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()
。(your-condition) ? (true-statements) : (false-statements)
例如,您无法编译以下代码片段:
(1==1) ? System.out.println("") : System.out.println("");
你遇到了以下编译错误:
The left-hand side of an assignment must be a variable
(你的条件) ? (真语句) : (假语句)
在Java中是可行的,但它必须返回一个值(不能是void),并且你必须将其赋值给一个变量。 - jalv1039你必须返回一些值,如果你希望它像一个没有返回值但执行某些操作的void方法那样工作,它将无法正常工作。
希望这可以帮到你...
不过在C++中,你可以编写一个返回void()的三元运算符,它在空的if语句中比else更有用。当将条件倒置变为单行if时,如果太长(在表达式中,而不是lambda函数),则可以使用它。
然而,它们有一些限制,我不建议在单行语句中嵌套它们(尤其是非三元语句中的主体),除非像else if这样的清晰的技巧。
关于你的示例,当直接返回条件时,三元运算符并不实用,即使条件相反,也可以在条件之前加上!而不使用三元运算符。