如何使用新的三元运算符?

时间:2017-01-26 10:47:05

标签: java ternary

我有这段代码:

if (providers.length > 0) 
        this.providers = providers;
    else 
        throw new IllegalArgumentException();

我想简化它。我去了:

(providers.length > 0) ? this.providers = providers : throw new IllegalArgumentException();

但这给了我一个编译器错误。为什么呢?

4 个答案:

答案 0 :(得分:4)

三元运算符不起作用的原因是因为分配值。含义:“:”之后的“else”部分需要返回与“?”之后的“then”情况相同类型的值。

并且throw new不会返回提供者对象...

但最后,这无关紧要;因为该代码的非常简单版本看起来更像:

if (providers.length == 0) {
    throw new IllegalArgumentException();
}

this.providers = providers;

为了让事情更容易阅读,你甚至可以选择:

checkProvidersNotEmpty(providers);
this.providers = providers;

换句话说:将异常抛出移动到单独的方法中。这里的隐式约定是名为checkSomething()的方法在检查失败时抛出异常。除此之外:在创建异常时给出合理的信息。 稍后帮助调试。

您不会争取尽可能短的节目,而是为了获得最佳阅读体验的最短版本。

在这里使用三元运算符会产生“易于阅读”的体验。因此:忘了它。

答案 1 :(得分:0)

Method Call using Ternary Operator

与Java相同,你必须返回相同类型的对象。

答案 2 :(得分:0)

我认为您实际上无法执行此操作,因为无法将throw new IllegalArgumentException()语句分配给providers

来自Java documentation about Equality, Relational, and Conditional Operators

  

条件运算符

     

[...]   另一个条件运算符是?:,可以将其视为   if-then-else语句的简写(在控件中讨论)   本课程的流程声明部分)。该运算符也是已知的   作为三元运算符,因为它使用三个操作数。在里面   下面的示例,此运算符应读作:" If   someConditiontrue,将value1的值指定给result。   否则,请将value2的值指定为result。"

答案 3 :(得分:-1)

你也可以这样做:

this.providers = providers.length > 0 ? providers : null;
if (this.providers == null)
    throw new IllegalArgumentException();

但通常你应该让你的代码在这样的情况下使用。 在那种情况下,情况要好得多,也不那么复杂。