【问题标题】:Convert the value in an Option to another type将 Option 中的值转换为另一种类型
【发布时间】:2014-02-05 19:06:41
【问题描述】:

我正在尝试做一些看起来应该在 scala 中具有直接语法/功能的事情。我只是不知道那是什么。我正在尝试将 Option 的包含值(如果不是 None)转换为另一种类型。

我只是想知道如果我想实现以下功能会是什么代码

def myFunc(inVal:Option[Double]):Option[BigDecimal] = {
    //Code I need goes here
}

注意:我并没有真正实现这个功能,它只是我展示我需要什么的最清晰的方式

【问题讨论】:

    标签: scala scala-option


    【解决方案1】:
    def myFunc(inVal: Option[Double]): Option[BigDecimal] =
      inVal map {d => d: BigDecimal}
    

    一般来说,如果你想在容器中转换值(OptionSeqListTryFuture 等),你应该在这个容器上使用方法map

    方法 map 接受 lambda(函数)作为参数并将此函数应用于所有元素。 map 不应更改元素的数量:Some 上的 map 将永远不会返回 None

    您可以使用BigDecimal.apply 方法将Double 转换为BigDecimal,如下所示:

    BigDecimal(1.1)
    // res0: scala.math.BigDecimal = 1.1
    

    但也存在从DoubleBigDecimal 的隐式转换,因此您可以像这样指定所需的类型:

    1.1: BigDecimal
    // res0: scala.math.BigDecimal = 1.1
    
    val bd: BigDecimal = 1.2
    

    PS:类型推断允许你在这里使用d => d而不是d => d: BigDecimal,但这会让你的代码很不清楚。

    【讨论】:

    • @som-snytt:更新了,虽然我无法想象有人会尝试以这种方式使用map
    • @senia 非常有帮助的答案。我并没有将 Option 概念化为另一个容器,我真正想做的是转换容器的内容。以这种方式思考真的很有帮助,希望将来能阻止我被困在其他地方。
    • @RandallSchulz:我猜“容器”比“M-word”更适合初学者,虽然 Reader 不是容器。
    • @RandallSchulz 所有这一切都需要 F 字 :)
    • @senia reader 很容易被视为一个容器。以无限流为例,我认为大多数人都会同意它是“容器化的”。这对于自然数的读者来说是同构的,具有与 monad/applicative/functor 相同的风格。
    【解决方案2】:
    def myFunc(inVal: Option[Double]): Option[BigDecimal] = inVal map { BigDecimal(_) }
    

    def myFunc(inVal: Option[Double]): Option[BigDecimal] = inVal map { BigDecimal.apply }
    

    之所以有效,是因为 Option 是 Functor(在这个简单的用例中没有单子技巧)

    【讨论】:

      【解决方案3】:

      扩展 @senia@Yann Moisan 的答案,如果您想在 Option[] 中保留一些内容,同时仍提供 默认值 在转换阶段(可能是您的框架中的一个要求),您可以使用这个:

      def myFunc(inVal: Option[Double]): Option[BigDecimal] = {
        Some(inVal.map(BigDecimal(_)).getOrElse(BigDecimal(0.0)))
      }
      

      它不仅会将您的Option[Double] 转换为Option[BigDecimal],还会创建一个默认 BigDecimal(值为0.0)以防原点Option[Double] 为空.

      【讨论】:

        猜你喜欢
        • 2012-03-28
        • 2023-02-07
        • 1970-01-01
        • 2020-12-02
        • 2012-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-24
        • 1970-01-01
        相关资源
        最近更新 更多