2013-03-21 1 views
1

Xtend 자습서와 Movies 예제를 따랐습니다. 이 튜토리얼의 끝에서, 당신은이 질문을 찾을 수 있습니다Xtend "Movies example"우수 답변

는 영화가 등급으로 분류되어 먼저
@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으로 줄일 수있는 List가 생겼습니다.

맵 대신 줄이기를 사용하고을 줄일 수도 있습니다. 어떻게 아십니까?

내 질문은 다음과 같습니다. 마지막 질문에 대한 최선의 답변은 무엇입니까?

지도() 확장 메소드를 사용하지 않고 동일한 "합계"값을 계산하는 방법을 찾았지만 저에게는 지겹게 보입니다. 여기 내 해결책은 다음과 같습니다.

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

더 나은 (더 명확한) 방법이 있습니까?

답변

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) 어떤 열망 계산을 수행하지 않고 필요에 따라 평가됩니다 유의하시기 바랍니다, 그래서 성능이지도 기능을 사용하는 솔루션에 대한 문제가되지해야한다. 그럼에도 불구하고 fold은 요소 유형과 다른 결과 유형이있는 값 집합에 대한 결과를 누적해야 할 경우 매우 편리합니다.

+1

나는 동의하지만 튜토리얼의 Xtend, 질문 3은'map [numberOfVotes] .reduce [a, b | a + b]'간단한 'reduce'호출에 의해, 이것은 내가 이해하지 못하는 것입니다. 정말 좋은 방법이있을 수 있습니까? – Antwane