你能在if子句中存储一个变量吗?

我有点等待这个问题的’不’回答。

我感兴趣的是,如果在if子句中检查变量,可以同时保存变量。

假设我有这个代码。

if(foo!=null){ if(foo.getBar()!=null){ Bar bar = foo.getBar(); System.out.println("Success: " + bar); } else { System.out.println("Failure."); } } else { System.out.println("Failure."); } 

我现在处理“失败”状态 – 即使结果是相同的,也是独立的。 我可以这样把他们聚在一起:

 if(foo!=null && foo.getBar()!=null){ Bar bar = foo.getBar(); System.out.println("Success: " + bar); } else { System.out.println("Failure."); } 

已经有更简洁的代码了。 如果foo为null,它将停在那里并且不会尝试foo.getBar(在if中)所以我不会得到NPE。 我想要提升的最后一件事,以及主要问题:我是否真的两次打电话给foo.getBar()? 如果getBar()将是一个非常繁重的操作,那么离开第二个相同的调用会很好。 所以我想知道是否有可能做一些与此类似的事情:

 if(foo!=null && (Bar bar = foo.getBar())!=null){ Bar bar = foo.getBar(); System.out.println("Success: " + bar); } else { System.out.println("Failure."); } 

如果我愿意,我将不得不将其分解为两个不同的if

 Bar bar = foo.getBar(); if (bar!=null) ... 

这是你能得到的最接近的:

 Bar bar; if(foo!=null && (bar = foo.getBar())!=null){ System.out.println("Success: " + bar); } else { System.out.println("Failiure."); } 

我在迭代BufferedReader的行时使用了这种技术:

 BufferedReader br = // create reader String line while ((line = br.readLine()) != null) { // process the line } 

所以是的,你可以做一个任务,结果将是左侧变量,然后你可以检查。 但是,在测试中声明变量是不合法的,因为它们只会作用于该表达式。

如果你想限制条形栏的范围,我会在迈克尔发布的代码周围添加{和}。

 void foo()
 {
     //一些代码......

     //此块限制“条形条”的范围,以便方法的其余部分无法看到 
     //它
     {
        酒吧吧;
         if(foo!= null &&(bar = foo.getBar())!= null){
             System.out.println(“成功:”+栏);
         } else {
            的System.out.println( “Failiure。”);
         }
     }
 }

如果有意义,您可能还需要检查空对象模式。 我个人试图避免事情为空,如果我可以……真的想想你是否想让null被允许。

来自“我的编程语言优于您的编程语言”部门:在Groovy中 ,您可以使用“?”。 运营商:

 Bar bar = foo?.bar if (bar != null) { } 

在Java中,这是一个很好的模式(*):

 Bar bar = foo == null ? null : foo.getBar(); if (bar != null) { } 

*:您可以在指尖保存的东西。

三点完全没有回答这个问题:

null是邪恶的。 不要编写返回它的方法。 然后你的示例问题就会消失。

我想你可能会错过封装。 而不是foo.getBar()可以使foo的接口执行“tell do not ask”操作?

表达式中的副作用往往会导致错误的代码。 更喜欢更简单的线条,以减少有缺陷的线条。 通常的exception,如果在访问缓冲区时使用++来增加索引,或类似的迭代器样式算法。

实际上我认为这是使用Java Optional执行此操作的一种方法,这是一个示例:

 Optional.ofNullable("text").ifPresent( $0 -> { System.out.println($0.toUpperCase()); }); 

或者在你的情况下:

  if(foo != null){ Optional.ofNullable(foo.getBar()).ifPresent(bar -> { System.out.println("Success: " + bar); }); }