有没有办法避免使用._1更具可读性

时间:2016-07-08 21:18:02

标签: scala scala-collections

我正在使用Scala语言中的以下代码。

val newCars = existingCars.filter(_.id > 0).map((_.name, _.plate, _.date))
val filteredCars = newCars.filter(_._1 != 0 && _._2.isEmpty && _._3.isEmpty)

有没有办法避免使用_._ 1,_._ 2和_._ 3更具可读性?

Scala语言中有一些内容,如下面的代码?

val newCars = existingCars.filter(_.id > 0).map((_.name, _.plate, _.date))
val filteredCars = newCars.
    filter((id, name, date) => id != 0 && name.isEmpty && date.isEmpty)

3 个答案:

答案 0 :(得分:2)

您可以使用部分功能

newCars.filter {
  case (id, name, date) => id != 0 && name.isEmpty && date.isEmpty
}

也可以在过滤器之外定义部分函数,​​组合并重复使用。

如果您碰巧使用该特定格式,您可能会对案例类感兴趣。如果您已经了解它们,也许您应该知道可以使用.tupled方法直接从元组构建它们

.map(x=>MyCaseClass.tupled(x))

答案 1 :(得分:1)

要添加到其他答案,您可能需要使用collectfilter组合的map。使用{}时,请务必使用大括号case

您可以执行以下操作:

val newCars = List( 
  ("123ABC", "Chevy", "2016"), 
  ("234BCD","Ford","2016"), 
  ("345DEF","","")
)

val filteredCars = newCars.collect{ 
  case (id,name,date) if id.nonEmpty && name.isEmpty && date.isEmpty =>
    (id,name,date)
}

答案 2 :(得分:0)

首先,你的代码不会编译:你有map取3个函数的元组,filter取3个参数的函数。我认为你的意思是

val newCars = existingCars.filter(_.id > 0).map(x => (x.name, x.plate, x.date))
val filteredCars = newCars.filter(x => x._1 != 0 && x._2.isEmpty && x._3.isEmpty)

对于这种情况,我建议先过滤:

existingCars.filter(_.id > 0).filter(car => car.name != 0 && car.plate.isEmpty && car.date.isEmpty).map(car => (car.name, car.plate, car.date))

(因为_._1对应于name,而不是id,因此可能会出现问题中给出的条件。然后你可以简化两个filter s:

existingCars.filter(car => car.id > 0 && car.name != 0 && car.plate.isEmpty && car.date.isEmpty).map(car => (car.name, car.plate, car.date))