Изменить элемент (ы) в списке, где условие выполняется
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))
Это как условно map
, Большинство элементов проходят через неизмененные, но те элементы, которые удовлетворяют условию, изменяются / отображаются на карте.
2 ответа
Насколько я знаю, такого не существует, хотя вы можете сделать это с помощью неявного преобразования:
implicit class ListOps[A](self: List[A]) extends AnyVal {
def updateIf(predicate: A => Boolean, mapper: A => A): List[A] = {
self.map(el => if (predicate(el)) mapper(el) else el)
}
}
Тестовое задание:
@ 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))
Может я что то упускаю, но это просто стандарт map
, Я бы пошел с простым подходом, как это:
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))
Конечно, вы можете сфера qualifyIf
в Person
сопутствующий объект, или даже Person
Класс дела сам, если хотите.
Может быть что-то похожее на то, что вы ищете у кошек или Скалаз, но если вы уже не используете эти библиотеки, было бы неплохо представить их только для этого.