Java:三元,不返回。(用于方法调用)
我想知道是否可以进行三元运算,但不返回任何内容 如果在Java中不可能,那么在其他语言中也可以吗?如果可以,哪些语言适用Java:三元,不返回。(用于方法调用),java,methods,boolean,return,ternary,Java,Methods,Boolean,Return,Ternary,我想知道是否可以进行三元运算,但不返回任何内容 如果在Java中不可能,那么在其他语言中也可以吗?如果可以,哪些语言适用 name.isChecked() ? name.setChecked(true):name.setChecked(false); 不,你不能。但是,对于if-else语句来说,这有什么意义呢?你真的想保存7个字符吗 if (name.isChecked()) { name.setChecked(true); } else { name.setChecked(
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);
不要在意你能做什么(在这种情况下):
三元运算符或“条件”运算符的作用是在表达式中引入条件。换言之,这:
int max = a > b ? a : b;
是这方面的简写:
int max;
if ( a > b ) {
max = a;
} else {
max = b;
}
如果没有生成值,则条件运算符不是快捷方式。在java中,以下代码是不可能的:
(your-condition) ? (true-statements) : (false-statements)
对于示例,您无法编译以下snipet代码:
(1==1) ? System.out.println("") : System.out.println("");
出现以下编译错误:
The left-hand side of an assignment must be a variable
有时,您可以对方法参数使用三元运算来解决您的请求
name.setChecked(name.isChecked() ? true : false);
顺便说一下,解决你问题的最好办法是
name.setChecked(name:isChecked());
我想知道是否可以进行三元运算,但不返回任何内容
不,这是不可能的:
(your-condition) ? (true-statements) : (false-statements)
if
语句
如果在Java中不可能,那么在其他语言中也可以吗?如果可以,哪些语言适用
name.isChecked() ? name.setChecked(true):name.setChecked(false);
我有点生疏,但是我相信C、C++和Perl都允许在不使用它们的值的地方使用任意表达式。
< p>您必须返回一些值,如果您希望它像一个空方法执行,而不返回值,则它将不起作用。希望这能有所帮助……我假设问题中的用例只是一个糟糕的例子,因为它等同于以下语句:
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));
public void onUpdate(int price, long amount) {
(amount == 0) ? tree.remove(price) : tree.put(price, amount); // compilation error
}
然后像这样使用它:
static void ternaryVoid(boolean condition, Runnable ifTrue, Runnable ifFalse) {
(condition ? ifTrue : ifFalse).run();
}
ternaryVoid(name.isChecked(), () -> name.setChecked(true), () -> name.setChecked(false));
public void onUpdate(int price, long amount) {
(amount == 0) ? tree.remove(price) : tree.put(price, amount); // compilation error
}
但它失去了三元运算符的优雅性,只有在代码的多个部分使用并且纳秒无关紧要的情况下,它才值得付出“努力”
但这对于if-else语句有什么意义呢?你真的想保存7个字符吗
if (name.isChecked()) {
name.setChecked(true);
} else {
name.setChecked(false);
}
我很惊讶这样的陈述是以反问句的形式出现的。是的,节省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) {
@SuppressWarnings("unused")
Long dummy = (amount == 0) ? tree.remove(price) : tree.put(price, amount);
}
否则,这些解决方案是不适用的,正如其他人所回答的,这些解决方案是不存在的。例如,可以尝试以下方法:
Consumer<Void> dummy = (x) -> {};
dummy.accept(/*...*/);
consumerdummy=(x)->{};
dummy.accept(/*…*/);
但有趣的是,第二行编译时既没有任何参数,也没有任何参数
似乎最好的通用解决方案是上面的helper方法ternaryVoid()
在JavaScript中可能实现,例如:(您的条件)?(true语句):(false语句)
在java中是可能的,但它必须返回一个值(不能为void),并且必须将其分配给一个变量。这个问题已经得到了回答。请