Shapeless сделает это за вас.
import shapeless._
import shapeless.syntax.std.product._
case class Fnord(a: Int, b: String)
List(Fnord(1, "z - last"), Fnord(1, "a - first")).sortBy(_.productElements.tupled)
Получает
res0: List[Fnord] = List(Fnord(1,a - first), Fnord(1,z - last))
productElements превращает класс кейса в бесформенный HList:
scala> Fnord(1, "z - last").productElements
res1: Int :: String :: shapeless.HNil = 1 :: z - last :: HNil
И списки HL преобразуются в кортежи с #tupled:
scala> Fnord(1, "z - last").productElements.tupled
res2: (Int, String) = (1,z - last)
Производительность может быть ужасной, поскольку вы постоянно конвертируете.Вы, вероятно, конвертируете все в кортежную форму, сортируете ее, а затем конвертируете обратно, используя что-то вроде (Fnord.apply _).tupled
.