为什么 Mono 不能持有 NULL

Why can't a Mono hold a NULL

Mono.just(null) 不会编译。这是为什么?

在程序层面上我明白了。有一个没有要处理的东西的处理队列是没有意义的。有人可以用更深入的技术为我解释这个吗?

按照 Reactive-Streams 的规定

Calling onSubscribe, onNext, onError or onComplete MUST return normally except when any provided parameter is null in which case it MUST throw a java.lang.NullPointerException to the caller, for all other

并且 Reactor 基于 Reactive Streams。

就我个人而言,我不喜欢这个规则,但规则不是我定的。既然要用,那就只能跟着了

我猜Flux是Reactor的核心,Mono是附带的。对于流,禁止 NULL 可能是一个合理的选择,尽管它对 Mono 不方便。

null 进入 application/library 有很高的风险,如果可以禁止,应该禁止。

Null 就像是在您的应用程序中放了一颗炸弹,如果某些东西可能是 null,那么某些东西可能会随时以 NullPointerException 爆炸。

null 始终在应用程序中产生巨大的不确定性。你应该尽早清理 null

人们通过到处进行 null 检查来解决这个问题,这基本上是多余的操作。

先生。 Tony Hoare - null 的发明者著名地声称 null 是他的:

billion dollar mistake.

有很多编程语言没有 null,这里有一个长长的列表:

在流中使用 null 是没有意义的,因为这也意味着反应堆库必须在他们的代码中进行 null 检查以确保他们不会尝试对 null 值进行运算。每个人都必须在每个 flatMapmapfilteroperator 等处进行 null 检查,因为总共可能存在 NullPointerException那些运营商。

所以他们有机会排除 null,这很有意义,因为 null 不是一个值,而且只有值可以在流中传输,所以这可能就是他们决定反对的原因它。

相反,他们决定使用类型 Void 来表示“无”,可以通过调用 Mono<Void> nothing = Mono.empty(); 获得类型安全的类型,如果你触摸它不会爆炸,并且表现得像你一样期待,因为开发人员控制它,而不是运行时。

我反而会问自己,为什么你真的需要 null?我猜是因为你已经习惯了,习惯性地编写代码是不好的。

我看到 null 被使用的次数有 95% 可能已被删除。

学习如何在没有 null 的情况下进行编码,养成使用默认值、回退值等的习惯。这很可能会使您的程序更健壮,更具确定性。

原因已经被其他人解释过了,Mono.justOrEmpty(null) 的存在是为了让你的生活更轻松一些,如果你想让 null 产生一个空的 Mono,但它需要是一个你的深思熟虑