我想在元组上使用一些函数,它返回元组只有第一个元素被转换而其他元素没有变化.
这是Tuple2的天真版本:
def mapFirst[T, U, R](tuple: (T, U))(f: T => R): (R, U) = tuple match {
| case (x, y) => f(x) -> y
| }
mapFirst((1, 2))(_ * 5) // returns (5, 2)
Run Code Online (Sandbox Code Playgroud)
虽然,它不觉得原生,我想要的是这样写:
(1, 2).mapFirst(_ * 5)
Run Code Online (Sandbox Code Playgroud)
我写了隐式转换然后:
class RichTuple[T, U](tuple: (T, U)) {
def mapFirst[R](f: T => R): (R, U) = tuple match {
case (x, y) => f(x) -> y
}
}
implicit def tuple2RichTuple[T, U](tuple: (T, U)): RichTuple[T, U] = new RichTuple(tuple)
(1, 2).mapFirst(_ * 5)
Run Code Online (Sandbox Code Playgroud)
然后,当我想要在Tuple3上映射第二个元素或第一个元素时,我将不得不再次编写相同的样板文件.是否有一些库内置了这样的方法?
您可以使用无形元组函数:
import shapeless._
import syntax.std.tuple._
val x=(1,2,3)
val y=x.updatedAt(0,x.head*5)
// y= (5,2,3)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
772 次 |
| 最近记录: |