有没有办法避免使用 ._1 来提高可读性

Is there a way to avoid using ._1 to be more readable

我正在用 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)

您可以使用部分函数

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

部分函数也可以在您的过滤器之外定义、组合和重用。

如果您碰巧使用该特定格式,您可能会对大小写 类 感兴趣。如果您已经了解它们,也许您应该知道可以使用 .tupled 方法

直接从元组构建它们
.map(x=>MyCaseClass.tupled(x))

首先,您的代码无法编译:您 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)。然后你可以简化两个 filters:

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

要添加其他答案,您可能需要使用 collect,它结合了 filtermap。请记住在使用 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)
}