在 Scala 中将字符串加载到 Case 对象

Load a String to Case Object in Scala

我有以下对象:

  sealed abstract class ImputationStrategy(name: String)

  object ImputationStrategy {
    case object Mean extends ImputationStrategy("Mean")
    case object Median extends ImputationStrategy("Median")
    case object Mode extends ImputationStrategy("Mode")

    def fromString(imputeStrategy: String): Option[ImputationStrategy] = imputeStrategy.toLowerCase match {
      case "mean"   => Some(Mean)
      case "median" => Some(Median)
      case "mode"   => Some(Mode)
      case _        => None
    }

  }

我在应用程序启动期间加载的另一个 Config 对象中使用它。

case class ImputerConfig(strategy: ImputationStrategy = ImputationStrategy.Mean)

但不幸的是,当我这样解析它时:

  imputerConfig = ImputationStrategy.fromString(cfg.getString("imputer.strategy")).orElse(ImputationStrategy.Mean)

它说它期待一个选项,但找到了 ImputationStrategy.Mean.type。我尝试将 String 解析为 case 对象的方式有问题吗?

使用getOrElse:

imputerConfig = ImputationStrategy.fromString(cfg.getString("imputer.strategy")).getOrElse(ImputationStrategy.Mean)

orElse 接受 Option。我认为在你的情况下你想在解析出错时给出一个默认对象。因此 getOrElse 更合适,因为 returns Option 对象的值