Krz*_*lny 43 java null nullable
通常,我可以看到如下代码构造:
if(a == null || b == null || c == null){
//...
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有任何广泛使用的库(谷歌,阿帕奇等)同时检查多个对象的无效,例如:
if(anyIsNull(a, b, c)){
//...
}
Run Code Online (Sandbox Code Playgroud)
要么
if(allAreNulls(a, b, c)){
//...
}
Run Code Online (Sandbox Code Playgroud)
更新:
让它更具挑战性,并用以下内容替换原始示例:
if(a != null && a.getFoo() != null && a.getFoo().getBar() != null){
//...
}
Run Code Online (Sandbox Code Playgroud)更新2:
我已经为Apache Commons Lang库创建了一个pull请求来修复这个差距:
这些将被纳入commons-lang,版本3.5:
anyNotNull (Object... values)allNotNull (Object... values)tob*_*s_k 39
在Java 8中,您可以使用Stream.allMatch检查所有值是否与特定条件匹配,例如null.不短,但可能更容易阅读.
if (Stream.of(a, b, c).allMatch(x -> x == null)) {
...
}
Run Code Online (Sandbox Code Playgroud)
并且为了anyMatch和noneMatch.
关于你的"更具挑战性的例子":在这种情况下,我认为没有办法编写懒惰评估的空检查结合,就像你拥有的那样:
if (a != null && a.getFoo() != null && a.getFoo().getBar() != null) {
...
}
Run Code Online (Sandbox Code Playgroud)
任何其他方法,使用流,列表或VAR-ARG方法,将试图评估a.getFoo()之前a已经过测试,不被null.你可以使用Optionalwith map和方法指针,这些指针将被一个接一个地延迟评估,但这是否使它更具可读性是有争议的,可能因情况而异(特别是对于更长的类名):
if (Optional.ofNullable(a).map(A::getFoo).map(B::getBar).isPresent()) {
...
}
Bar bar = Optional.ofNullable(a).map(A::getFoo).map(B::getBar).orElse(null);
Run Code Online (Sandbox Code Playgroud)
另一种选择可能是try访问最里面的项目,但我觉得这不是一个好习惯,或者:
try {
Bar bar = a.getFoo().getBar();
...
catch (NullPointerException e) {
...
}
Run Code Online (Sandbox Code Playgroud)
特别是,这也将赶上其他NPE的后访问该元素-要么,你必须把只有Bar bar = ...在try和其他一切在另一个if之后块try,抵消在可读性和简洁的任何(可疑)的收益.
(我依稀记得一些关于符号的东西a?.getFoo()?.getBar() != null,但我不记得它是对Java的特征请求还是一些完全不同的语言.)
Pet*_*ček 25
编辑2018年:自Apache Commons lang 3.5以来,已有ObjectUtils.allNotNull()和ObjectUtils.anyNotNull().
没有.
的无Apache的百科全书郎(3.4) ,谷歌番石榴(18)和弹簧(4.1.7)提供了这样的工具方法.
如果你确实需要它,你需要自己编写它.在现代Java代码中,我可能会考虑需要这样的构造代码味道.
kam*_*mwo 12
您还可以使用类似以下方法的内容.它允许您根据需要传递任意数量的参数:
public static boolean isAnyObjectNull(Object... objects) {
for (Object o: objects) {
if (o == null) {
return true;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
您可以使用任意数量的参数调用它:
isAnyObjectNull(a, b, c, d, e, f);
Run Code Online (Sandbox Code Playgroud)
你可以做类似的事情areAllNull.
public static boolean areAllObjectsNull(Object... objects) {
for (Object o: objects) {
if (o != null) {
return false;
}
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
注意:您也可以使用三元运算符代替if (o == null).此处显示的两种方法没有错误处理.根据您的需要进行调整.
Objects.requireNonNullObjects在类及其方法的帮助下这是可能的requireNonNull。
public static void requireNonNull(Object... objects) {
for (Object object : objects) {
Objects.requireNonNull(object);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
26932 次 |
| 最近记录: |