我可以在行内进行 null 检查吗?

10
我有一个类似以下的Java命令:

I have a Java command that looks something like below:


Foo f = new Foo();
String string = f.format(new Bar().getSelection());
                       // ^ may be null
有时我的Bar对象返回null,这是有意设计的。 对我来说,自然而然的做法是将命令拆分成多行,并单独进行null检查,例如:
Foo f = new Foo();
BarSel bs = new Bar().getSelection();
String string = "";
if (bs != null) {
    string = f.format(bs);
    // continue...
}

然而,我想知道是否有一种方法可以在一行中完成这个任务?是否可能在一行内对对象进行null检查?

我记得曾经阅读过使用问号的方法,但我不能回忆起确切的语法,我可能对此也有所错误。请注意,我不是指三元运算符,尽管这也是另一种有效的方法。

7个回答

14

我忘了提到,尽管我知道三目运算符,但我希望这一次能避免使用它。 - Redandwhite

8
我想你还记得 Elvis 操作符(http://mail.openjdk.java.net/pipermail/coin-dev/2009-March/000047.html),但它被项目 coin 拒绝了(https://blogs.oracle.com/darcy/entry/project_coin_final_five)。
然而,Jakarta Commons 有类似 nvl 的函数,如http://commons.apache.org/lang/api-2.6/org/apache/commons/lang/StringUtils.html#defaultString(java.lang.String)。尽管这些函数不是标准 Java,但它们最终会成为某个库的依赖,出现在大多数程序中。
当您设计一个具有有效空结果的函数时,您将遇到一个常见问题:您必须在每个地方记录和处理特殊情况。我可以几乎保证,在维护过程中,有人会搞砸这个问题,导致虚假的空指针异常。这就是为什么我通常建议设计不返回 null 的方案。

这实际上就是我所指的。 - Redandwhite

8

我比较晚才参与其中,但我想要找到类似的东西,并找到了使用Java 8的Optional类。以下是针对问题陈述的解决方案:

String string = Optional.ofNullable(bs).map(f::format).orElse("");

2

使用三元运算符的另一种方式:

String string = bs == null ? "" : f.format(bs);

1

它也可以在Java中实现。 - zeller
可以在JVM上实现,但不是用Java。虽然你可以混合使用Groovy和Java - Groovy将自己编译为Java类,并在JVM上执行。(能够使用漂亮的语法糖和闭包等好处导致了替代JVM语言的开发) - Konstantin Pribluda
我的意思是,空对象模式可以在Java中实现,而不是空安全解引用。 - zeller

0

你可以使用三元运算符。

string = bs != null ? f.format(bs) : "";

如果bs不为null,这将给你一个空字符串。或者你可以直接使用:

if (bs != null) string = f.format(bs);


0
Foo f = new Foo();
BarSel bs = new Bar().getSelection();
String string = bs != null ? f.format(bs) : "";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接