【问题标题】:Best and safe practice to get value from Option type? [duplicate]从选项类型中获取价值的最佳和安全做法? [复制]
【发布时间】:2020-11-18 22:45:01
【问题描述】:

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

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

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

但这不是一个好习惯。怎么办:listExample.headOption.flatten.ToString 这安全吗?

【问题讨论】:

  • 如果列表有两个以上的元素会怎样?如果它只有一个元素怎么办?如果它是空的怎么办?如果这些元素中的任何一个是 None 怎么办? - 也就是说,不清楚你的要求是什么。

标签: list scala types option scala-collections


【解决方案1】:

没有好的答案。

只需使用.get?

“如何从选项中获取价值?”问题的答案就是简单地使用get。这是确定获得价值的唯一方法。 get 非常努力地将其从 Option 中提取出来;您将始终在常规程序流程中获得价值。这是因为,如果get 的任务是不可能的,那么你的本地程序流会被Exception 终止。

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

但是,除了简单地“getting 来自Option”的值之外,您还能做什么呢?这取决于在None 的情况下会发生什么——而不是Exception

否则,这取决于……

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

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

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

flatMapmapfoldexistsforallfilterorElse 等可以使这个列表更长。

所以,您的问题的最终答案是:这取决于...

【讨论】:

  • 我猜还有getOrElse?
  • @GamingFelix 是的,我不记得该方法的正确名称。已修复,谢谢。
  • 没问题! :)
  • 另外,如果您在一个列表或至少多个值上执行此操作,flatMap 非常有用:)
  • 我避免 get 是因为我已经读到最好避免它。
【解决方案2】:

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

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

只提取默认值

opt.getOrElse(default)

默认处理和提取

op.fold(default)(process)

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

(opt1 orElse opt2).getOrElse(default)

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

list.flatten.headOption

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

list.flatten.lift(n)

【讨论】:

    猜你喜欢
    • 2017-02-17
    • 1970-01-01
    • 2020-02-26
    • 2015-01-02
    • 2020-11-04
    • 2013-12-03
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    相关资源
    最近更新 更多