Какая функция Scala заменит это процедурное утверждение? - PullRequest
4 голосов
/ 19 января 2012

Mindblock здесь, но я не могу понять, как сделать это менее уродливо:

def getClosestSphere(ray: Ray, spheres: List[Sphere]): Sphere = {
    val map = new HashMap[Double, Sphere]
    for (sphere <- spheres) {
      val intersectPoint = sphere.intersectRay(ray)
      map.put(intersectPoint, sphere)
    }    
    map.minBy(_._1)._2  
  }

Ты видишь, что я делаю? У меня есть список сфер, где каждая сфера имеет метод intersectRay, возвращающий двойной.

Я хочу взять Сферу с наименьшим результатом этой функции. Я ЗНАЮ, что есть хорошая функциональная конструкция, позволяющая мне делать это в одну строку, я просто не вижу ее: (

Ответы [ 2 ]

14 голосов
/ 19 января 2012

Вы можете просто сделать:

def getClosestSphere(ray: Ray, spheres: List[Sphere]): Sphere = {
  spheres.minBy(_ intersectRay ray)
}

Совет по стилю, в качестве отступления:

При использовании изменяемой коллекции используйте квалифицированный импорт.Для java.util.SomeCollection сначала import java.{util => ju}, а затем используйте имя ju.SomeCollection.Для scala.collection.mutable.SomeCollection сначала import collection.mutable, а затем используйте имя mutable.SomeCollection.

5 голосов
/ 19 января 2012
spheres.minBy(_.intersectRay(ray))
...