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(

我想知道是否可以进行三元运算,但不返回任何内容

如果在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);
不要在意你能做什么(在这种情况下):

三元运算符或“条件”运算符的作用是在表达式中引入条件。换言之,这:

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)
  • 第二个和第三个操作数必须是非空表达式;i、 它们必须产生一些实际价值

    “第二个或第三个操作数表达式调用void方法是编译时错误。”——

  • 三元表达式是表达式,不能用作语句

    “某些类型的表达式可以用分号作为语句。”。。。三元表达式不是那种-

  • 如果您确实想使用三元表达式,但不想使用表达式的值,那么最简单的方法是将值指定给虚拟变量,并添加注释以抑制关于未使用变量的警告

    但更好的办法是使用一个简单的
    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),并且必须将其分配给一个变量。这个问题已经得到了回答。请