Я размышлял над тем же и пришел к вашему вопросу сегодня.
Мне не очень нравятся подходы с частичными функциями (все, что имеет case
), поскольку они подразумевают, что может быть больше точек входа для логического потока. По крайней мере, для меня они имеют тенденцию размывать намерения кода. С другой стороны, я действительно хочу идти прямо к кортежным полям, как вы.
Вот решение, которое я разработал сегодня. Кажется, это работает, но я еще не пробовал в производстве.
object unTuple {
def apply[A, B, X](f: (A, B) => X): (Tuple2[A, B] => X) = {
(t: Tuple2[A, B]) => f(t._1, t._2)
}
def apply[A, B, C, X](f: (A, B, C) => X): (Tuple3[A, B, C] => X) = {
(t: Tuple3[A, B, C]) => f(t._1, t._2, t._3)
}
//...
}
val list = List( ("a",1), ("b",2) )
val list2 = List( ("a",1,true), ("b",2,false) )
list foreach unTuple( (k: String, v: Int) =>
println(k, v)
)
list2 foreach unTuple( (k: String, v: Int, b: Boolean) =>
println(k, v, b)
)
Выход:
(a,1)
(b,2)
(a,1,true)
(b,2,false)
Может быть, это окажется полезным. Естественно, объект unTuple
следует оставить в некотором пространстве имен инструмента.
Добавление:
Применительно к вашему делу:
val m = l.filter( unTuple( (n:Int,color:String) =>
n != 2
))