Scala 在条件为真的列表中修改元素

Scala 在条件为真的列表中修改元素,scala,functional-programming,combinations,higher-order-functions,Scala,Functional Programming,Combinations,Higher Order Functions,有没有一种组合子/高阶函数的方法可以做到这一点?比如: case class Person(name: String, age: Int, qualified: Boolean = false) val people: List[Person] = .... val updated: List[Person] = people.map(person => if (person.age >= 25) person.copy(qualified=true) el

有没有一种组合子/高阶函数的方法可以做到这一点?比如:

case class Person(name: String, age: Int, qualified: Boolean = false)

val people: List[Person] = ....

val updated: List[Person] = people.map(person => 
  if (person.age >= 25) 
    person.copy(qualified=true) 
  else
    person  // unmodified
))

// Setting every person above 25 y.o. as qualified

它就像一个有条件的
映射
。大多数元素未经修改就通过,但是那些满足条件的元素被修改/映射到。

据我所知,没有这样的东西,尽管您可以通过隐式转换:

people.updateWhere(_.age >= 25, _.copy(qualified=true))
测试:


也许我遗漏了什么,但这只是一张标准的
地图。我会选择这样一种简单的方法:

@ case class Person(name: String, age: Int, qualified: Boolean = false)
defined class Person
@  val people = List(Person("A", 3, false), Person("B", 35, false))
people: List[Person] = List(Person("A", 3, false), Person("B", 35, false))
@ people.updateIf(_.age >= 25, _.copy(qualified=true))
res3: List[Person] = List(Person("A", 3, false), Person("B", 35, true))
当然,如果愿意,您可以将
qualifyIf
作用域扩展到
Person
伴随对象,甚至扩展到
Person
案例类本身


可能与您在或中所要查找的内容完全相同,但除非您已经使用了这些LIB,否则仅为此介绍它们并不是一件好事。

请至少使其
扩展AnyVal
以避免运行时开销谢谢,我通常都记得这一点。但你说的“至少”是什么意思?是的,那会有用的。但是,您必须记住,要使用这种皮条客方法,必须在任何地方导入隐式。我只是有点惊讶,并没有一个用于此的组合符——有这么多的组合符。若你们忘了编译器会提醒你们:p我需要这样的东西很多次,但并没有找到标准库的解决方案。
@ case class Person(name: String, age: Int, qualified: Boolean = false)
defined class Person
@  val people = List(Person("A", 3, false), Person("B", 35, false))
people: List[Person] = List(Person("A", 3, false), Person("B", 35, false))
@ people.updateIf(_.age >= 25, _.copy(qualified=true))
res3: List[Person] = List(Person("A", 3, false), Person("B", 35, true))
scala> case class Person(name: String, age: Int, qualified: Boolean = false)
defined class Person

scala> val people = List(Person("John", 25), Person("Frank", 30))
people: List[Person] = List(Person(John,25,false), Person(Frank,30,false))

scala> def qualifyIf(p: Person)(pred: Person => Boolean) = if (pred(p)) p.copy(qualified = true) else p
qualifyIf: (p: Person)(pred: Person => Boolean)Person

scala> people.map(qualifyIf(_)(_.age > 25))
res1: List[Person] = List(Person(John,25,false), Person(Frank,30,true))