没有别的条件三元

时间:2016-08-03 10:32:58

标签: java

我已经阅读了类似的问题,并了解到不可能使用三元运算而不是else语句,它没有if-without else语句。因为 if( calculation < 1 ){ calculation= 0; } 语句是二进制而不是三元组。我的问题是更好的做法。

在我的代码中,有很多像这样的代码片段

calculation = calculation < 1 ? 0 : calculation;

我想用tenary缩短这些。使用以下内容更改这些语句是一种好的做法。

listView.setOnTouchListener(new OnTouchListener() {

    public boolean onTouch(View v, MotionEvent event) {

        // If the user wants to scroll, override the default event
        if (event.getAction() == MotionEvent.ACTION_MOVE) {
            return true; // So the system doesn't handle the event
        }
        return false;
    }

});

2 个答案:

答案 0 :(得分:2)

您可以创建一个可以创建流畅API的类(或多个类)。这样你的路线就是:

calculationTo = replace(calculationTo).with(0).when(calculationTo < 1)

在我看来,它并不比标准if语句读得好得多,但它也取决于你拥有的条件。

示例实施:

public class Replacer<T> {

    private final T value;
    private T replacementValue;

    private Replacer(T value) {
        this.value = value;
    }

    public static <V> Replacer<V> replace(V value) {
        return new Replacer<V>(value);
    }

    public Replacer<T> with (T replacementValue) {
        this.replacementValue = replacementValue;
        return this;
    }

    public T when(boolean condition) {
        if (condition) {
            return replacementValue;
        } else {
            return value;
        }
    }

}
import static somepackage.Replacer.replace;

public class Main {

    public static void main(String[] args) {
        int calculationTo = 3;

        calculationTo = replace(calculationTo).with(0).when(calculationTo < 1);
    }

}

你可以扩展它或使条件成为一个函数,这样它就可以和lambda等一起使用。我也会让方法with返回不同类的对象(例如ReplacerWithValue),这样就可以调用{{ 1}}在一个链中两次会导致编译错误。

答案 1 :(得分:0)

既然您要求最佳实践,我会指出您可以做得更好的事情,然后我会告诉您为什么我喜欢这个三元运营商。

让我重新编写你的代码片段:

if (calculatedValueAfterStep1 < 1) {
    calculatedValueAfterStep2 = 0;
} else {
    calculatedValueAfterStep2 = calculatedValueAfterStep1;
}

当您阅读代码时,有人会问您&#34;&#39;计算&#39;代表&#34?;那么你不能在不询问行号的情况下回答这个问题。 &#34;计算&#34;的含义更改程序代码的过程。如果你无法解释一个变量意味着什么,你就不能给它一个好名字。这就是为什么我更喜欢我的版本。有一个明确的定义变量的含义&#34; calculatedValueAfterStep1&#34;和&#34; calculatedValueAfterStep2&#34;是。是的,名字很糟糕。相应地将它们更改为您的域。

现在,当您查看代码时,您会注意到&#34; calculatedValueAfterStep2&#34;没有宣布。所以让我们改变代码:

int calculatedValueAfterStep2 = -1;
if (calculatedValueAfterStep1 < 1) {
    calculatedValueAfterStep2 = 0;
} else {
    calculatedValueAfterStep2 = calculatedValueAfterStep1;
}

现在变得丑陋了。询问早期问题的同一个人现在会问&#34;为什么会计算出来的问题?用&#39; -1&#39;?&#34;初始化。所以这里有三元运算符:

int calculatedValueAfterStep2 = (calculatedValueAfterStep1 < 1) ? 0 : calculatedValueAfterStep2;

美了!