Scala中如何部分初始化全为Optional类型的大型Case Class
解决Scala Case Class部分字段初始化的问题
首先纠正你代码里的两处语法错误:
Option(String)要写成Option[String](Scala泛型的标准写法)- 初始化时不能直接传原始值(比如
"Anto"、21),必须用Some()包装成Option类型,或者用None表示空值
下面是几种可行的解决方案:
方法1:给Case Class设置默认参数(最推荐)
修改Case Class定义,给每个Option类型字段设置默认值为None,这样未指定的字段会自动填充为空:
case class Employee( Name: Option[String] = None, Age: Option[Int] = None, Designation: Option[String] = None, Salary: Option[Int] = None, ZipCode: Option[Int] = None )
使用时可以灵活指定字段:
// 只初始化Name字段 val EmployeesData = Seq(Employee(Name = Some("Anto"))) // 按顺序传参(后面字段用默认值) val EmployeesData2 = Seq(Employee(Some("Anto"))) // 指定任意组合的字段 val EmployeesData3 = Seq(Employee(Name = Some("Anto"), Age = Some(21), Salary = Some(2000)))
方法2:添加辅助构造器(不修改原Case Class时用)
如果不能改动原Case Class的定义,可以在伴生对象里添加辅助构造器:
// 原Case Class定义不变 case class Employee( Name: Option[String], Age: Option[Int], Designation: Option[String], Salary: Option[Int], ZipCode: Option[Int] ) // 伴生对象里定义辅助构造器 object Employee { // 只初始化Name的构造器 def apply(name: Option[String]): Employee = Employee(name, None, None, None, None) // 初始化Name和Age的构造器 def apply(name: Option[String], age: Option[Int]): Employee = Employee(name, age, None, None, None) // 可根据需求添加更多构造器 }
使用方式:
val EmployeesData = Seq(Employee(Some("Anto"))) val EmployeesData2 = Seq(Employee(Some("Anto"), Some(21)))
方法3:用copy方法基于默认实例修改
先创建一个全空的默认实例,再通过copy方法修改需要的字段:
// 创建所有字段为None的默认实例 val defaultEmp = Employee(None, None, None, None, None) // 复制并修改指定字段 val EmployeesData = Seq(defaultEmp.copy(Name = Some("Anto"))) val EmployeesData2 = Seq(defaultEmp.copy(Designation = Some("Software Engineer"), ZipCode = Some(56798)))
注意点
Scala里Option类型的设计就是为了避免null,所以优先用None表示空值,不要直接传null,否则会破坏Option的语义,失去它的安全特性。
内容的提问来源于stack exchange,提问作者sdgaw erzswer
相关产品推荐
相关产品推荐

