繁体   English   中英

如何 Map 与 Scala 中的案例 class

[英]How to Map with a case class in Scala

我正在尝试转换一个 Map 和我使用 Apply 定义的案例 class。

case class ETLConfig (srcTableName:Option[String] = None, 
                  idCol:Option[String] = None , 
                  orderingCol:Option[String] = None)

object ETLConfig {
      def apply(map: Map[String, String]): ETLConfig =
        ETLConfig(map.get("srcTableName"),map.get("idCol"),map.get("orderCol"))
    }
Error:
command-512604125416347:2: error: too many arguments for method apply: (map: Map[String,String])ETLConfig in object ETLConfig
  def apply(map: Map[String, String]):ETLConfig = ETLConfig(map.get("srcTableName"),map.get("idCol"),map.get("orderCol"))

有人可以指出我在做什么错吗?

我也尝试了以下方法并且正在工作。

val empMap:Map[String, String] = Map("srcTableName" -> "Employee","idCol" -> "EmpId", "orderCol" -> "CreatedOn" )
val empConfig = ETLConfig(dtMap.get("srcTableName"),dtMap.get("idCol"), dtMap.get("orderCol"))
val srcTable = dtConfig.srcTableName.orNull

编辑:由于您使用的是 Databricks,因此您应该在package 单元格中定义您的类和对象。

原答案:

我假设您在 REPL 中执行此操作。 案例 class 及其配套案例 object 需要在同一个文件中。 在通常的 Scala REPL 中,每个命令都算作一个新的“文件”。 这意味着您的ETLConfig object 不是您的案例 class 的伴侣,因此它会影响您的应用方法而不是重载它(因此您不能调用原始方法)。

在官方的 Scala REPL 中,可以使用:paste命令解决这个问题:

scala> :paste
// Entering paste mode (ctrl-D to finish)

case class ETLConfig (srcTableName:Option[String] = None, 
                  idCol:Option[String] = None , 
                  orderingCol:Option[String] = None)

object ETLConfig {
      def apply(map: Map[String, String]): ETLConfig =
        ETLConfig(map.get("srcTableName"),map.get("idCol"),map.get("orderCol"))
    }

// Exiting paste mode, now interpreting.

defined class ETLConfig
defined object ETLConfig

从您的 output 看来,您使用的是不同的 REPL,所以我不知道这是否可行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM