scala中case对象匹配的有效方法

scala中case对象匹配的有效方法,scala,Scala,我想得到在印度和中国工作的学生和员工 object Countries { sealed trait Country {def name: String} case object FRANCE extends Country {val name = "FRANCE"} case object INDIA extends Country {val name = "INDIA"} case object CHINA extends Country {val name = "CHINA

我想得到在印度和中国工作的学生和员工

object Countries {
  sealed trait Country {def name: String}
  case object FRANCE extends Country {val name = "FRANCE"}
  case object INDIA extends Country {val name = "INDIA"}
  case object CHINA extends Country {val name = "CHINA"}
  val list = Seq(FRANCE, INDIA, CHINA)
}

def getCountry: Option[Countries.Country] ={
  //some DB call to return country based on some parameters .I assume INDIA here
  Option(Countries.INDIA)
}

case class Student(name: String, id: Symbol = Symbol("Id"))

def getStudentName(name: Option[String]): Option[Student]={
  val std = name
    .filterNot(_.isEmpty)
    .map(Student(_))

  getCountry.collect {
    case Countries.INDIA => std
    case Countries.CHINA => std
  }.flatten              
}

case class Emp(id: Int)

def getEmp(id: Option[String]): Option[Emp] = {
  val emp = id.flatMap(_ => Option(Emp(id.get.toInt)))
  getCountry.collect {
    case Countries.INDIA => emp
    case Countries.CHINA => emp
  }.flatten
}

有没有什么有效的方法来避免重复的代码使用
collect
和我已经完成的大小写匹配。

我投了反对票,因为代码远未编译,这让我无法理解这个问题。你说的“高效”是什么意思?你的意思是可读性(例如不重复本身)还是其他(例如性能更好)?@C4storcheck@TzachZohar这意味着readability@C4stor“远未编译”是一种夸张,有一个错误(
Country
而不是
Countries.Country
)…我投了反对票,因为代码远未编译,让我无法理解这个问题。你说的“高效”是什么意思?你的意思是可读性(例如不重复本身)还是其他(例如性能更好)?@C4storcheck@TzachZohar这意味着readability@C4stor“不可能编译”是一个夸张的说法,有一个错误(
Country
而不是
Countries.Country
)…谁能解释
结果:=>Option[T]
:=>
scalait中的符号是按名称
参数的语法。这意味着只有在需要时才对参数求值,而不是在需要之前。类型为
=>A
的参数是类型为
A
的参数,但它将按名称而不是值传递。也就是说,它将在每次代码中出现时进行求值,而不是在调用函数时进行一次求值。另一种方式是,您实际传递的是函数give a,而不是a的实例,并且此函数将在每次需要时被调用。是的,实际上,它只是
函数的一个语法糖0
任何人都可以解释
结果:=>选项[T]
:=>
scalait中的符号是
按名称
参数的语法。这意味着只有在需要时才对参数求值,而不是在需要之前。类型为
=>A
的参数是类型为
A
的参数,但它将按名称而不是值传递。也就是说,它将在每次代码中出现时进行求值,而不是在调用函数时进行一次求值。另一种方式是,您实际传递的是函数give a而不是a的实例,并且此函数将在每次需要时被调用。是的,它实际上只是
Function0
def ifCountry[T](result: => Option[T], countries: Country*) = getCountry
  .filter(countries.toSet)
  .flatMap(_ => result)


def getStudentName(name: Option[String]) = ifCountry(
   name.filterNot(_.isEmpty).map(Student(_)),
   INDIA, CHINA
)

def getEmp(id: Option[String]) = ifCountry(
    id.map(Emp(_)), 
    INDIA, CHINA
}