你能在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); }); }