有没有办法避免使用 ._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
)。然后你可以简化两个 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))
要添加其他答案,您可能需要使用 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)
}
我正在用 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
)。然后你可以简化两个 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))
要添加其他答案,您可能需要使用 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)
}