Java:三元无回报。 (用于方法调用)

时间:2012-02-26 05:39:37

标签: java methods boolean return ternary

我想知道是否有可能进行三元操作但没有返回任何东西。

如果在Java中不可能在其他语言中使用,那么哪些适用?

name.isChecked() ? name.setChecked(true):name.setChecked(false);

6 个答案:

答案 0 :(得分:47)

不,你不能。但是这超过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;
}

如果没有生成值,则条件运算符不是快捷方式。

答案 1 :(得分:12)

  

我想知道是否有可能进行三元操作但没有返回任何东西。

不可能:

  1. 第二个和第三个操作数必须是非void表达式;即他们必须产生一些实际价值。

      

    “对于第二个或第三个操作数表达式来说,调用void方法是一个编译时错误。” - JLS 15.25

  2. 三元表达式是一个表达式,不能用作语句。

      

    “某些类型的表达式可以通过用分号跟随它们来用作语句。” ...并且三元表达式不是其中之一 - JLS 14.8

  3. 如果你真的,真的想要使用三元表达式但不使用表达式的值,那么最简单的方法是将值赋给虚拟变量,并添加注释以抑制关于变量的警告使用

    但更好的想法是使用简单的if语句。

      

    如果在Java中不可能在其他语言中使用,那么哪些适用?

    我有点生疏,但我相信C,C ++和Perl都允许在不使用它们的值的地方使用任意表达式。

答案 2 :(得分:5)

有时,您可以对方法参数使用三元运算来解决您的请求。

name.setChecked(name.isChecked() ? true : false);

顺便说一下,你的问题的最佳解决方案是

name.setCecked(name:isChecked());

答案 3 :(得分:0)

在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

答案 4 :(得分:0)

你必须返回一些值,如果你想让它像一个void方法一样执行某些动作而不返回一个值,它就不会起作用。

希望这会有所帮助......

答案 5 :(得分:0)

我认为问题中的用例只是一个糟糕的例子,因为它等效于以下语句:

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()