Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 8 Elvis运算符中的Null检查?_Java_Nullpointerexception_Java 8 - Fatal编程技术网

Java 8 Elvis运算符中的Null检查?

Java 8 Elvis运算符中的Null检查?,java,nullpointerexception,java-8,Java,Nullpointerexception,Java 8,问题:是否计划在未来的Java版本中实现Elvis操作符?或者是否有任何库将其引入Java 我已经读过了 它是为JavaSE7提出的,但没有进入该版本 我知道Java8允许这样做 String name = computer.flatMap(Computer::getSoundcard) .flatMap(Soundcard::getUSB) .map(USB::getVersion)

问题:是否计划在未来的Java版本中实现Elvis操作符?或者是否有任何库将其引入Java

我已经读过了

它是为JavaSE7提出的,但没有进入该版本

我知道Java8允许这样做

String name = computer.flatMap(Computer::getSoundcard)
                          .flatMap(Soundcard::getUSB)
                          .map(USB::getVersion)
                          .orElse("UNKNOWN");
但我觉得对我的口味来说有点太多了。因此,如果有人能向我指出任何将类似Groovy的/C#语法引入Java进行空检查的项目/库,我将不胜感激

编辑:由Elvis操作员我的意思是:

String version = computer?.getSoundcard()?.getUSB()?.getVersion();

或类似的

否。目前或将来都没有计划重新考虑Java中的空安全运算符

很久以前,有一个函数

public static Foo getFoo(Bar bar) {
  return bar.getFoo();
}
人们就是不同意如果bar为空会发生什么

首先,会有人声称违反函数的意图应该受到检查异常的惩罚

public static Foo getFoo(Bar bar) throws FooNotFoundException {
  if (bar == null) throw new FooNotFoundException();
  return bar.getFoo();
}
public static Foo getFoo(Bar bar) {
  if (bar == null) return null;
  return bar.getFoo();
}
public static Foo getFoo(Bar bar) {
  if (bar == null) return Foo.Empty;
  return bar.getFoo();
}
然后,函数的调用方将被迫考虑这个场景。它必须捕获异常或重新引用它。它将是如此强大,以至于会惹恼人们,很快他们就会争辩说,这不应该是一个已检查的异常,而应该是一个运行时异常,以使其不那么强大

public static Foo getFoo(Bar bar) {
  if (bar == null) throw new FooNotFoundException();
  return bar.getFoo();
}
有些人会声称抛出异常没有意义,因为java无论如何都会抛出异常:一个Nullpointer异常

public static Foo getFoo(Bar bar) throws FooNotFoundException {
  if (bar == null) throw new FooNotFoundException();
  return bar.getFoo();
}
public static Foo getFoo(Bar bar) {
  if (bar == null) return null;
  return bar.getFoo();
}
public static Foo getFoo(Bar bar) {
  if (bar == null) return Foo.Empty;
  return bar.getFoo();
}
那些害怕意外异常的人只会让他们的代码更容易重新编译,并在函数的开头添加
null
-检查,而只会返回
null

public static Foo getFoo(Bar bar) throws FooNotFoundException {
  if (bar == null) throw new FooNotFoundException();
  return bar.getFoo();
}
public static Foo getFoo(Bar bar) {
  if (bar == null) return null;
  return bar.getFoo();
}
public static Foo getFoo(Bar bar) {
  if (bar == null) return Foo.Empty;
  return bar.getFoo();
}
很快,人们就会争论是否可以返回空列表,或者这些空列表是否也应该是
null
值。“当然,您不想在每次迭代之前检查可空性,是吗?”另一方会争辩说。很快,他们将创建各种构造来完全避免可空性

public static Foo getFoo(Bar bar) throws FooNotFoundException {
  if (bar == null) throw new FooNotFoundException();
  return bar.getFoo();
}
public static Foo getFoo(Bar bar) {
  if (bar == null) return null;
  return bar.getFoo();
}
public static Foo getFoo(Bar bar) {
  if (bar == null) return Foo.Empty;
  return bar.getFoo();
}
每种方法都会产生广泛的后果。而这些后果将使不同方法难以结合。这些后果将导致编码规则,其中每个单独的规则将与下一个规则纠缠在一起。这种纠缠会给人一种印象,即每一条规则都是无可争议的。最后,编码规则将变得像宗教,只有在整个规则集的范围内才有意义

根据您对规则集的选择,您在使用某些框架时会遇到困难最后,没有被检查的宗教例外的空列表占据了主导地位。这种宗教可以总结如下:

  • 应避免返回
    null
  • 如果列表为空,则按原样返回
  • 如果您迭代一个列表,您永远不必检查null
  • 方法不应抛出已检查的异常
  • 选中的异常应包装在运行时异常中
  • 字符串不应该是
    null
    ,而应该是
显然,这种宗教变得如此强大,以至于它成功地影响了框架和语言规范

public static Foo getFoo(Bar bar) throws FooNotFoundException {
  if (bar == null) throw new FooNotFoundException();
  return bar.getFoo();
}
public static Foo getFoo(Bar bar) {
  if (bar == null) return null;
  return bar.getFoo();
}
public static Foo getFoo(Bar bar) {
  if (bar == null) return Foo.Empty;
  return bar.getFoo();
}
  • 空列表的编译器优化
  • 可选
  • 值类型
一些外部库和编辑器实际上会通过提供注释(
@Null
@NotNull
)来重新组合不同的团队。IDE只会为您标记所有违规行为。一个简单但有效的解决方案。尽管如此,JDK从未包含自己的
@Null
@NotNull
,而是每个库都必须提供自己的

考虑到所有这些,现在,java中不太可能有elvis操作符。如果您想用java编写代码,最好忘记
null

或者用托尼·霍尔(null的发明者)的话来说:

我称之为我的数十亿美元的错误。这是空的发明 1965年的参考文献。当时,我正在设计第一个 面向对象系统中引用的综合类型系统 语言(ALGOL W)。我的目标是确保所有引用的使用 应该是绝对安全的,由 编译器。但我忍不住想输入一个空值 引用,只是因为它很容易实现。这导致了 无数错误、漏洞和系统崩溃 可能在过去四十年里造成了十亿美元的痛苦和损失 年

就我个人而言,我认为这绝对没有意义,因为事实上每种像样的编程语言都有一个空值。有些甚至有多个表示不同类型的可空性。毕竟,即使在数学中也有未定义的值

public static Foo getFoo(Bar bar) throws FooNotFoundException {
  if (bar == null) throw new FooNotFoundException();
  return bar.getFoo();
}
public static Foo getFoo(Bar bar) {
  if (bar == null) return null;
  return bar.getFoo();
}
public static Foo getFoo(Bar bar) {
  if (bar == null) return Foo.Empty;
  return bar.getFoo();
}
无论如何,如果你没有猫王接线员,你仍然可以

Foo foo = bar == null ? null : bar.getFoo();

这完全符合java的精神。毕竟,在2021年,java是一种非常显式的语言。

是Java8的一部分,但我不知道elvis操作符的用法,
?。
不是groovy所说的elvis操作符。这将是
?:
“安全导航”操作员。Elvis运算符是一个缩短的三元运算符,其结果要么是正在操作的项目,要么是空/假的替代项。感谢澄清,我是否应该更改问题的标题?这里讨论了Elvis运算符:从2014年10月23日到今天(2016年6月)有没有想过现在就实施它?@SrujanBarai-Nope。C#语法再次获胜。另请参见:好吧。你无法得到比这个答案更权威的回答。