如果每个业务逻辑都不允许缺失值,为啥要使用 Optional.of 方法[重复]

Posted

技术标签:

【中文标题】如果每个业务逻辑都不允许缺失值,为啥要使用 Optional.of 方法[重复]【英文标题】:Why use Optional.of method if a missing value is not permitted per business logic [duplicate]如果每个业务逻辑都不允许缺失值,为什么要使用 Optional.of 方法[重复] 【发布时间】:2021-07-29 10:04:23 【问题描述】:

而不是像下面这样初始化optCar变量:

Optional<'Car'> optCar = Optional.of(car);

为什么不将它简单地初始化为:

Car optCar = car;

什么时候业务逻辑不允许 car 为空?

【问题讨论】:

如果你有一个空检查你不需要可选的。但是可选的全部要点是避免空检查。如果你可以确定 car never 为空,你可以去掉这个可选的。 在这种情况下,我希望在缺失值的地方抛出 NullPointerException,以便我可以捕获错误。那么,使用 Optional.of 方法有什么意义呢? "为什么不把它初始化成..." 为什么不问问写代码的人呢? @ChandanKumar “使用 Optional.of 方法有什么意义?” -> 错误的问题。正确的问题是“为什么要使用Optional?” 您通常将Optional.of 与文字一起使用。如果您的方法返回一个可以为 null 的 Integer,并且在某些情况下您希望返回数字 1,则可以使用 Optional.of(1) 而不是 Optional.ofNullable(1) 【参考方案1】:

你完全可以。

可选的适用于您有代码的情况

If(object == null) …

相反,您使用 Optional,然后您可以很酷地访问类似流的功能和/或使您的代码更好的语句,例如:

return Optional.ofNullable(object).orElse(defaultObject);

或者另一个例子

return Optional.ofNullable(object).map(Object::toString).orElseThrow();

如果该可选对象存在,则最后一个代码返回您对象的字符串表示形式,否则将引发异常。 orElseThrow 在您确实确定对象始终存在的情况下最有用,因此这种情况可能永远不会出现,如果您知道在哪里看的话。

但是就像我一开始说的,如果你不需要这些功能,你就不需要使用它

【讨论】:

Objects.requireNonNullElse 更好地用于第一种情况 IMO。【参考方案2】:

如果您确定 car 永远不能为空,那么使用 Optional 将是一种矫枉过正。

Optional 的存在是为了清楚说明这个特定实例可以为 null,并且 Optional 需要被解包并明确检查值的缺失(或存在)。

不要照我说的,听专家说的:

我们的目的是为库方法返回类型提供一种有限的机制,其中需要一种明确的方式来表示“无结果”,并且使用 null 来表示这种情况极有可能导致错误。

摘自 Brian Goetz 的回答 here。

【讨论】:

以上是关于如果每个业务逻辑都不允许缺失值,为啥要使用 Optional.of 方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥要创建一个二进制列来指示具有缺失值的记录

数据预处理-缺失值

为啥允许将 std::optional 与值进行比较? [复制]

详解逻辑回归与评分卡-用逻辑回归制作评分卡-重复值和缺失值处理菜菜的sklearn课堂笔记

为啥称为“业务逻辑”?这个词是从哪里来的? [关闭]

ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 啥都不做