我正在使用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)
答案 0 :(得分:2)
您可以使用部分功能
newCars.filter {
case (id, name, date) => id != 0 && name.isEmpty && date.isEmpty
}
也可以在过滤器之外定义部分函数,组合并重复使用。
如果您碰巧使用该特定格式,您可能会对案例类感兴趣。如果您已经了解它们,也许您应该知道可以使用.tupled
方法直接从元组构建它们
.map(x=>MyCaseClass.tupled(x))
答案 1 :(得分:1)
要添加到其他答案,您可能需要使用collect
和filter
组合的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))