Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java三元黑客_Java_Ternary Operator - Fatal编程技术网

java三元黑客

java三元黑客,java,ternary-operator,Java,Ternary Operator,所以我这里不追求可维护性或优雅性。。寻找一种方法来减少方法中的总令牌数,只是为了好玩。该方法由一个长嵌套的if-else构造组成,我发现(我认为)用最少的标记来实现它的方法是三元运算符。基本上,我将其翻译为: String method(param) { if (param == null) return error0; else if (param.equals(foo1)) if (condition) return

所以我这里不追求可维护性或优雅性。。寻找一种方法来减少方法中的总令牌数,只是为了好玩。该方法由一个长嵌套的if-else构造组成,我发现(我认为)用最少的标记来实现它的方法是三元运算符。基本上,我将其翻译为:

String method(param) {

    if (param == null)
        return error0;

    else if (param.equals(foo1))
        if (condition)
            return bar1;
        else
            return error1;

    else if (param.equals(foo2))
        if (condition)
            return bar2;
        else
            return error1;

    ...


    else
        return error;

}
为此:

String method(param) {

    return 

        param == null ?
            error0 :

        param.equals(foo1) ?
            condition ?
                bar1 :
                error1 :

        param.equals(foo2) ?
            condition ?
                bar2 :
                error2 :

        ...

        error

    }
然而,在一些情况下,除了返回一个值之外,我还想更改一个字段或调用一个方法;e、 g

    else if (param.equals(foo3))
        if (condition) {
            field = value;
            return bar3;
        }
        else
            return error3;
做这件事最便宜的方法是什么?我现在所做的是丑陋的,但不会浪费太多的令牌(这里的字段是一个字符串):

再说一次,重点不是好的编码,我只是在寻找黑客来减少令牌计数。如果有一个较短的方式来写整件事,我也愿意。谢谢你的建议


编辑:每个单词和标点符号都算作一个标记。例如,“instanceOf String”是两个标记,但“!=null”是三个。我能看到的可能改进的主要方面是“&&”和括号。是否有办法将“field=value”放在条件之外的某个地方,如果没有,是否有一个构造使“field=value”成为布尔值而不需要括号?

如果param为null,则返回0
然后对参数进行case/switch/select语句。那很干净

假设它已经满足了您的需求(因此当
value
null
时,它包括返回false),那么一个较短的替代方案就是

(field = value) != null
或者,如果您实际上忽略了这一点,并且想要使
null
返回
true
,那么使用

(field = value) == value
如果使用1个字母的变量名,则可以大大缩短


此外,我看不到其他方式,我同意我们大多数人的看法,这一切都有点令人讨厌;)

你应该被发射…离开大炮,直射太阳。三元运算符很好,但是代码的可维护性应该优先考虑。我同情那些必须维护你的代码的人。。。即使是你。如果你离开这个问题,甚至一个月后再回来,你会后悔用三元表达式编码。在这个问题上使用“黑客”标记的荣誉……你不应该为编译器(最便宜的wrt标记)优化,而应该为需要维护它的人优化。我会练习编写可维护代码,“为了好玩”(或者尝试更简洁的语言)。我知道你说过你不在乎,但真正的程序员不会有一个字符更少的解决方案,因为我们不会这样优化。坦率地说,这甚至不是一个有趣的问题;因为secondbanana正试图减少代币的数量只是为了好玩,我想我们可以跳过关于为什么这是一个坏主意的讨论。我怀疑他已经知道了。我不认为他想要“干净”(对未来的维护开发者来说很不幸)。你不能打开字符串。如果你对字符串有“相等”条件,可能需要一个枚举来完成这项工作。@mtpettyp:在Java 7:@fructedWithForms中是允许的设计者:如果你从这个问题的表述方式考虑,将来会有“未来维护开发者”在这个“代码库”上工作,那么我想了解一下你正在抽的东西,因为它看起来很重。实际上有一个程序对我们的工作进行评分,并将每个字符串和标点符号作为标记进行计数。所以“instanceOf String”是两个标记,“!=null”是三个。如果有一个不需要在“field=value”周围加括号的结构就好了,我不同意
=计数为2。从技术上讲,这是一个操作员。嗯,我刚刚检查了一下,这个程序实际上是算数的!=就像oneIt一样,它确实可以编译而不需要括号,但实际上您需要它们!否则它将错误地计算
字段=(值!=null)
=的优先级高于
=
(field = value) != null
(field = value) == value