Вы можете использовать объекты, наследуемые от Product
. Это будет проще и безопаснее, если вы знаете arity заранее:
def getMax(foos: List[Product2[Int,Int]], f: Product2[Int,Int] => Int) = foos.map{f} ....
Тогда вы можете кормить getMax
чем-нибудь вроде Tuple
, например,
class Foo(val prop1: Int, val prop2: Int) extends Tuple2[Int, Int](prop1, prop2)
// this will duplicate values in an object actually.
getMax((new Foo(1,2)), _._2)
или наследовать права от Product
:
class Bar(val prop1: Int, val prop2: Int) extends Product2[Int, Int] {
def _1 = prop1
def _2 = prop2
}
val b = new Bar(2, 3)
getMax(List(b), _._2)
или просто используйте кортежи Scala:
getMax( (1,10) :: Nil, _._2)
getMax( List(1 -> 10), _._2)
// these are the same
Все станет сложнее, если вы заранее не знаете arity, потому что универсальный Product
позволит вам получать элементы только как Any
(см. Product.productElement(n: Int)
метод) - таким образом вы теряете безопасность типов. *