val sorted = List(1, 5, 15, 37, 39, 42, 50)
sorted match {
case Nil => None
case List(a) => None
case l => Some(l.sliding(2).map{case Seq(a, b) => math.abs(a - b)}.min)
}
// res1: Option[Int] = Some(2)
sliding
возвращает итератор, поэтому список должен проходить только один раз.
Если вам интересно узнать, какие два элемента имеют наименьший разрыв, вы также можете использовать minBy. Так что вот еще один вариант, просто для удовольствия.
sorted.view.zip(sorted.tail).minBy(t => math.abs(t._1 - t._2))
// res4: (Int, Int) = (37,39)