从期权类型中获取价值的最佳和安全做法?

Best and safe practice to get value from Option type?

考虑到最佳实践,我尝试在选项中获取值。 例如,我有:

val listExample : List[Option[String]] = List(Some("A"), Some("B))

我想访问 AB 一种方法是 listExample.head.get = "A"listExample.last.get = "B"

但这不是一个好的做法。怎么做:listExample.headOption.flatten.ToString 这样安全吗?

没有好的答案。

只需使用 .get?

“如何从期权中获取价值?”问题的答案就是简单地使用get。这是确定获得价值的唯一途径。 get 非常努力地从 Option 中提取它;您将始终以常规程序流程中的价值告终。这是因为,如果 get 的任务无法完成,那么您的本地程序流将被 Exception.

终止。

大多数人会同意避免 get 来避免 Exception,这通常会导致难以推理的非本地程序行为。

但是除了简单地“getOption 中获取一个值”之外,您还可以做什么?这取决于在 None 的情况下会发生什么——而不是 Exception:

否则,这取决于...

例如,如果您有一个 List[Option[A]] 并想要一个 List[A],只需忽略 None 值,然后执行 Option.flatten.

如果您希望副作用仅在存在值时发生,可能取决于该值,请使用 Option.foreach.

如果您想要获取存在的值,或者当存在 None 时获取默认值,请使用 Option.getOrElse.

并且 flatMapmapfoldexistsforallfilter 可以使此列表更长orElse,依此类推。

因此,您问题的最终答案是:这取决于……

这在很大程度上取决于你想做什么。

首先是用mapforeachfilter等处理Option里面的数据,containsexists forall 测试内容。在许多情况下,您可能根本不需要提取值。

只提取默认值

opt.getOrElse(default)

默认处理提取

op.fold(default)(process)

从多个选项中获取第一个有效的Option

(opt1 orElse opt2).getOrElse(default)

获取选项列表中的第一个有效选项

list.flatten.headOption

获取选项列表中的第 n 个有效选项

list.flatten.lift(n)