用其他元素替换某些元素的每个匹配项

Gre*_*reg 4 scala list

什么是最好的Scala方法从一些列表中替换元素x的每个出现的一些其他元素y?这就是我现在正在做的事情:

list map { 
  case `x` => y
  case a => a
}
Run Code Online (Sandbox Code Playgroud)

有更简洁的方法吗?谢谢.

小智 9

list.map(i => if (i==x) y else i)
Run Code Online (Sandbox Code Playgroud)

这个怎么样?


Aar*_*rup 7

如果你需要做很多事情,你可以编写一个实用函数:

def replace[T](x: T, y: T) = (i: T) => if (i == x) y else i
Run Code Online (Sandbox Code Playgroud)

这将允许你写

list map replace(x, y)
Run Code Online (Sandbox Code Playgroud)

或者,对于中缀语法:

class ReplaceWith[T](x: T) {
   def replaceWith(y: T) = (i: T) => if (i == x) y else i
}
object ReplaceWith {
   implicit def any2replaceWith[T](x: T) = new ReplaceWith(x)
}

// now you can write
list map (x replaceWith y)
Run Code Online (Sandbox Code Playgroud)

另一个解决方案是使用Map:

list map Map(x -> y).withDefault(identity)
Run Code Online (Sandbox Code Playgroud)

具有实用功能:

scala> def replace[T](pairs: (T, T)*) = Map(pairs: _*).withDefault(identity)
replace: [T](pairs: (T, T)*)scala.collection.immutable.Map[T,T]

scala> List(1,2,3) map replace(1 -> -1, 3 -> 4)
res0: List[Int] = List(-1, 2, 4)
Run Code Online (Sandbox Code Playgroud)