Java在三元操作中声明变量。可能吗?

Java在三元操作中声明变量。可能吗?,java,ternary-operator,Java,Ternary Operator,假设我们有一些city和String getZIP()方法。 我想打印ZIP的值,如果ZIP为空,则不打印任何内容 我可以用三元运算在一行代码中完成: System.out.print(city.getZIP() == null ? "" : city.getZIP()) 问题是:我可以不调用.getZIP()两次就执行相同的操作吗? 比如: System.out.print(String zip = city.getZIP() == null ? "" : zip) //syntax err

假设我们有一些
city
String getZIP()
方法。 我想打印ZIP的值,如果ZIP为空,则不打印任何内容

我可以用三元运算在一行代码中完成:

System.out.print(city.getZIP() == null ? "" : city.getZIP())
问题是:我可以不调用
.getZIP()
两次就执行相同的操作吗? 比如:

System.out.print(String zip = city.getZIP() == null ? "" : zip) //syntax error here

在单独的行中定义变量:

String zip = city.getZIP();
System.out.print(zip == null ? "" : zip);

我为您提供了一个完全不同的解决方案:不要这样做

不要将返回null作为“合法”结果的方法放在类上

例如:邮政编码可以/应该是它自己的类。然后您只需声明一些ZIP的单例实例来表示“ZIP代码未定义”。然后在“未知IP”上调用toString。。。例如,只给出一个空字符串

使用null作为返回值总是会导致出现NullPointerException


所以-不要这样做。

您可以将值分配给现有变量,但不能在ternery条件内创建一个变量

大概

String zip; // Created elsewhere but not assigned to city.getZip().
System.out.print(((zip = city.getZIP()) == null) ? "" : zip)

但是不能在其中声明新变量。

那么zip将只存在于该范围内,这意味着在剩下的代码中它是无用的。你也可以在print调用之前创建变量并检查这个变量?@Sloth为什么要这样做that@BalajiKrishnan我正在寻找一种方法,使它在一行代码中实现,而不在三元运算之外创建额外的局部变量,也不调用该方法两次你从中受益。要么调用getter两次,要么以附加的局部变量结束。我看不出这种方式有什么好处,但我想问的是,是否存在一行解决方案。请阅读我的问题。我不是在寻找问题的解决办法。@Sloth:那你在寻找什么呢?如果没有问题,你为什么要创建一个呢?@Sloth:这个答案中的代码就是这样做的。对于
“我可以不调用.getZIP()两次就执行相同操作吗?”
,这是答案。不清楚您还想完成什么。@Sloth:如果
getZip()
操作的成本很高,请将结果在内部缓存到
city
对象,以便两次调用该方法不会产生相同的成本。否则,将结果存储在对象外部的变量中。(一种称为Extract Variable:的重构模式)这种“存储结果而不必存储结果”的追求似乎没有效果;我只是建议您忘记一些微妙的语法问题,转而关注问题背后更重要的设计问题。您并不总是100%的代码制作人,您可以是客户机,在这种情况下,我认为Java遗漏了一些东西。看看这
String title=info.getTitle()==null有多可怕?“”:(“Title=“+info.getTitle())而您不能执行其他操作。