我有点等待这个问题的'不'答案。
我感兴趣的是,当您在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) ...
答案 0 :(得分:31)
这是你能得到的最接近的地方:
Bar bar;
if(foo!=null && (bar = foo.getBar())!=null){
System.out.println("Success: " + bar);
} else {
System.out.println("Failiure.");
}
答案 1 :(得分:11)
我在迭代BufferedReader的行时使用了这种技术:
BufferedReader br = // create reader
String line
while ((line = br.readLine()) != null) {
// process the line
}
所以是的,你可以做一个任务,结果将是左侧变量,然后你可以检查。但是,在测试中声明变量是不合法的,因为它们只会限定为该表达式。
答案 2 :(得分:7)
如果你想限制条形栏的范围,我会在迈克尔发布的代码周围添加{和}。
void foo() { // some code ... // this block limits the scope of "Bar bar" so that the rest of the method cannot see // it. { Bar bar; if(foo!=null && (bar = foo.getBar())!=null){ System.out.println("Success: " + bar); } else { System.out.println("Failiure."); } } }
如果有意义,您可能还需要检查空对象模式。我个人试图避免事情为空,如果我可以......真的想想你是否想要允许null。
答案 3 :(得分:2)
来自“我的编程语言优于您的编程语言”部门:在Groovy中,您可以使用“?”。操作者:
Bar bar = foo?.bar
if (bar != null) {
}
在Java中,这是一个很好的模式(*):
Bar bar = foo == null ? null : foo.getBar();
if (bar != null) {
}
*:你可以用指尖保存的东西。
答案 4 :(得分:1)
完全没有回答这个问题的三点:
null
是邪恶的。不要编写返回它的方法。然后你的示例问题就会消失。
我认为你可能会错过封装。而不是foo.getBar()
可以使foo
的界面成为执行“告诉不要求”的操作吗?
表达式中的副作用往往会导致错误的代码。更喜欢更简单的线条,以减少有缺陷的线条。在访问缓冲区时使用++
增加索引或类似的迭代器样式算法时常见的异常。
答案 5 :(得分:0)
实际上我认为使用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);
});
}
答案 6 :(得分:0)
您不能在 Java 条件中声明变量,但可以在 d[outer_dictionary_or_list][Inner_Dictionary_Or_List][And_So_On]
循环中声明:
for
但它并不漂亮。我完全同意 Tom Hawtin 的评论。