List 从期权类型中获取价值的最佳安全实践?

List 从期权类型中获取价值的最佳安全实践?,list,scala,types,option,scala-collections,List,Scala,Types,Option,Scala Collections,考虑到最佳实践,我试图在期权中获得价值。 例如,我有: val listExample : List[Option[String]] = List(Some("A"), Some("B)) 我想访问A和B 一种方法是执行,listExample.head.get=A,listExample.last.get=B 但这不是一个好的做法。执行以下操作:listExample.headOption.Flatte.ToString 这安全吗?没有好的答案 简单地使用,明白

考虑到最佳实践,我试图在期权中获得价值。 例如,我有:

val listExample : List[Option[String]] = List(Some("A"), Some("B))
我想访问A和B 一种方法是执行,listExample.head.get=A,listExample.last.get=B

但这不是一个好的做法。执行以下操作:listExample.headOption.Flatte.ToString
这安全吗?

没有好的答案

简单地使用,明白吗? 如何从期权中获得价值这一问题的答案是什么?就是简单地使用get。这是唯一一种获得价值的方法。get非常努力地将其从选项中提取出来;您将始终以常规程序流中的值结束。这是因为,如果get任务是不可能的,那么本地程序流将被异常终止

大多数人都会同意避免获取以避免异常,这通常会导致难以推理的非本地程序行为

但是你怎么做,而不是简单地从期权中获取价值呢?这取决于在无的情况下会发生什么,而不是例外情况:

否则,这取决于… 例如,如果您有一个列表[Option[a]]并且想要一个列表[a],只需忽略None值,然后执行Option.Flatte

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

如果要在有值时获取该值,或者在无值时获取默认值,请使用Option.getOrElse

这个列表可以通过flatMap、map、fold、exists、forall、filter、orElse等方式变得更长


所以,你的问题的最终答案是:这取决于……这在很大程度上取决于你想做什么

第一件事是使用map foreach filter等来处理选项内的数据,并包含exists for All来测试内容。在许多情况下,您可能根本不需要提取值

只提取默认值

opt.getOrElse(default)
op.fold(default)(process)
默认情况下处理和提取

opt.getOrElse(default)
op.fold(default)(process)
要从多个选项中获取第一个有效选项,请执行以下操作:

(opt1 orElse opt2).getOrElse(default)
获取选项列表中的第一个有效选项

list.flatten.headOption
list.flatten.lift(n)
获取选项列表中的第n个有效选项

list.flatten.headOption
list.flatten.lift(n)

我想还有getOrElse?@GamingFelix是的,我不记得该方法的正确名称。已修复,谢谢。没问题!:另外,如果你在一个列表或至少多个值上这样做,flatMap是非常有用的:我避免get,因为我读到最好避免get。如果列表有两个以上的元素,会发生什么?如果它只有一个元素呢?如果它是空的呢?如果这些元素中的任何一个都没有呢换句话说,您的需求是什么还不清楚。