Я бы попробовал сложить:
def merge(lotsOfColor: List[MyColor], delta: Double): List[MyColor] =
lotsOfColor.tail.foldLeft((List(lotsOfColor.head), lotsOfColor.head)) {
case ((mergedColors, lastColor), aColor) if (lastColor diff aColor) < delta =>
(mergedColors, lastColor merge aColor)
case ((mergedColors, _), aColor) => (aColor :: mergedColors, aColor)
}._1.reverse
Или, немного другой,
def merge(lotsOfColor: List[MyColor], delta: Double): List[MyColor] =
lotsOfColor.tail.foldLeft((List(lotsOfColor.head), lotsOfColor.head)) {
case ((mergedColors, lastColor), aColor) =>
if ((lastColor diff aColor) < delta)
(mergedColors, lastColor merge aColor)
else
(aColor :: mergedColors, aColor)
}._1.reverse
Есть еще один крутой прием, использующий ListBuffer в Scala, чтобы избежать обратного в конце:
import scala.collection.mutable.ListBuffer
def merge(lotsOfColor: List[MyColor], delta: Double): List[MyColor] =
lotsOfColor.tail.foldLeft((ListBuffer(lotsOfColor.head), lotsOfColor.head)) {
case ((mergedColors, lastColor), aColor) if (lastColor diff aColor) < delta =>
(mergedColors, lastColor merge aColor)
case ((mergedColors, _), aColor) =>
mergedColors += aColor
(mergedColors, aColor)
}._1.toList