Xtend“电影示例”最佳答案

时间:2013-03-21 09:37:21

标签: java reduce xtend

我遵循了Xtend教程和电影示例。在本教程结束时,您可以找到以下问题:

    @Test def void sumOfVotesOfTop2() {
      val long sum = movies.sortBy[ -rating ].take(2).map[ numberOfVotes ].reduce[ a, b | a + b ]
      assertEquals(47_229L, sum)
    }
  

首先,电影按评分排序,然后我们选出最好的两部电影。接下来,使用地图功能将电影列表转换为其numberOfVotes列表。现在我们有一个List,可以通过添加值将其缩减为单个Long。

     

您还可以使用reduce而不是map并缩小。你知不知道怎么?

我的问题是:上一个问题的最佳答案是什么?

我找到了一种不使用map()扩展方法计算相同“sum”值的方法,但对我来说似乎很糟糕。这是我的解决方案:

assertEquals(47229, this.movies.sortBy[ -rating ].take(2).reduce[m1, m2 | new Movie('', 0, 0.0, m1.numberOfVotes + m2.numberOfVotes,null)].numberOfVotes)

有更好(更清洁)的方法吗?

1 个答案:

答案 0 :(得分:2)

您可以使用fold(R seed, (R,T)=>R function)代替reduce((T,T)=>T)

assertEquals(47229, 
  movies
    .sortBy[rating]
    .reverseView
    .take(2)
    .fold(0L) [ result, movie | result + movie.numberOfVotes ])

请注意map((T)=>R)不会执行任何急切的计算,但会按需评估,因此对于使用map函数的解决方案而言,性能无关紧要。然而,如果你需要为结果类型与元素类型不同的一组值累加结果,fold非常方便。