代码之家  ›  专栏  ›  技术社区  ›  Zied Koubaa

scala:嵌套getorelse

  •  2
  • Zied Koubaa  · 技术社区  · 6 年前

    我要创建一个方法,该方法接受一个选项数组和一个默认值作为参数,并返回第一个非空选项,否则返回默认值:

    def customGetOrElse[T](options : Array[Option[T]], defaultValue : T) : T = {
      // Example if options contain 2 elements
      options(0).getOrElse(options(1).getOrElse(defaultValue))
      // If options contain 3 elements
      options(0).getOrElse(options(1).getOrElse(options(2).getOrElse(defaultValue)))
    }
    

    但我正在努力使这个方法适用于任何大小的数组。有什么想法吗?

    谢谢!

    3 回复  |  直到 6 年前
        1
  •  3
  •   Joe K    6 年前
    def customGetOrElse[T](options : Array[Option[T]], defaultValue : T) : T = {
      options.find(_.isDefined).flatten.getOrElse(defaultValue)
    }
    
        2
  •  4
  •   Nagarjuna Pamu    6 年前

    一个带 collectFirst

    def customGetOrElse[T](options: Array[Option[T]], defaultValue: T): T =
     options.collectFirst { case Some(value) => value }.getOrElse(defaultValue)
    

    鳞皮

    Welcome to Scala 2.12.6 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_162).
    Type in expressions for evaluation. Or try :help.
    
    scala> :paste
    // Entering paste mode (ctrl-D to finish)
    
    
     def customGetOrElse[T](options: Array[Option[T]], defaultValue: T): T =
      options.collectFirst { case Some(value) => value }.getOrElse(defaultValue)
    
    // Exiting paste mode, now interpreting.
    
    customGetOrElse: [T](options: Array[Option[T]], defaultValue: T)T
    
    scala> customGetOrElse[Int](Array(None, Some(1)), 2)
    res0: Int = 1
    
    scala> customGetOrElse[Int](Array(None, None), 2)
    res1: Int = 2
    
        3
  •  1
  •   Brian    6 年前

    使用 flatten 超过 options 减少 选项 对那些有价值的人来说。然后使用 headOption 归还 Option 包含当前的第一个值或 None . 最后,获取值 T 选择权 或归还 defaultValue .

    def customGetOrElse[T](options : Array[Option[T]], defaultValue : T) : T = {
      options.flatten.headOption.getOrElse(defaultValue)
    }
    

    实例:

    scala> customGetOrElse[Int](Array(None, None), 666)
    res29: Int = 666
    
    scala> customGetOrElse[Int](Array(None, Some(42)), 666)
    res30: Int = 42