1

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

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

首先,电影按评级排序,然后我们选择最好的两部电影。接下来,使用 map 函数将电影列表转换为他们的 numberOfVotes 列表。现在我们有一个列表,可以通过添加值将其简化为单个 Long。

您也可以使用 reduce 代替 map 和 reduce。你知道如何?

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

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

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

有没有更好(和更清洁)的方法来做到这一点?

4

1 回答 1

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如果您需要为一组值累积结果类型与元素类型不同的结果,这将非常方便。

于 2013-03-21T10:16:00.377 回答