2016-11-22 2 views
1

나는 관리 노래 목록을 가지고 있으므로 지금 노래를 분류하는 것이 나의 기준이다. 어떻게 이것을 람다 식으로 "변환"할 수 있습니까? 간단한특정 Comparator를 람다 식으로 변환하려면 어떻게해야합니까?

gestionCancionList.sort(new Comparator<GestionCancion>() { 
     @Override 
     public int compare(GestionCancion t1, GestionCancion t2){ 
      return t1.vecesQueSeRepite == t2.vecesQueSeRepite ? 
        t1.song.dameInterprete().compareTo(t2.song.dameInterprete()) 
        : (int)(t2.vecesQueSeRepite - t1.vecesQueSeRepite); 
     } 
    } 

답변

1

더 간단 : 매개 변수 유형이 비교기의 제네릭 형식에 의해 암시된다

Comparator<GestionCancion> aName = (t1,t2) -> t1.vecesQueSeRepite == t2.vecesQueSeRepite ? 
      t1.song.dameInterprete().compareTo(t2.song.dameInterprete()) 
      : (int)(t2.vecesQueSeRepite - t1.vecesQueSeRepite); 

.

편집 : 위와 더 간단하게 수행 할 수 있습니다. 비교기는 별도로 정의 할 필요가 없습니다. 람다 식은 즉시 sort 메서드에 전달 될 수 있습니다. 또한이 경우 매개 변수의 유형은 컬렉션 객체의 제네릭 유형에 의해 암시됩니다. 따라서 : 메소드 참조 (수)에

gestionCancionList.sort((t1,t2) -> t1.vecesQueSeRepite == t2.vecesQueSeRepite ? 
      t1.song.dameInterprete().compareTo(t2.song.dameInterprete()) 
      : (int)(t2.vecesQueSeRepite - t1.vecesQueSeRepite)); 
0

Comparator<GestionCancion> aName = (GestionCancion t1, GestionCancion t2)->t1.vecesQueSeRepite == t2.vecesQueSeRepite ? 
       t1.song.dameInterprete().compareTo(t2.song.dameInterprete()) 
       : (int)(t2.vecesQueSeRepite - t1.vecesQueSeRepite); 

here

+0

대단히 고맙습니다. 그래서 저는 하나의 방법을 사용하지 않고 동일한 방법을 사용하고 있습니다. "Comparator aName = (GestionCancion t1, GestionCancion t2) -> compare (t1, t2)" –

+0

또한 간단한 예제를 참조로 첨부했습니다. – Raghuveer

3

사용 Comparator 공장 방법 :

Comparator.<GestionCancion, Veces>comparing(gc -> gc.vecesQueSeRepite).reversed() 
    .thenComparing(GestionCancion::dameInterprete); 

는 다음 코드를 만들기 :

gestionCancionList.sort(
    Comparator.<GestionCancion, Veces>comparing(gc -> gc.vecesQueSeRepite).reversed() 
    .thenComparing(GestionCancion::dameInterprete)); 

트릭은을 유지하기 위해 reversed()을 적용하는 것입니다 깔끔한 코드.

필드에 액세스 할 때 람다의 명시적인 입력이 필요합니다 (어떤 유형이 vecesQueSeRepite인지 알려주지 않았으므로, 필요에 따라 실제 유형을 Veces으로 대체했습니다).

+0

유망하지만 유감 스럽지만'vecesQueSeRespite'는 필드가 아니라 메소드이며, 그 값의 비교는 반대입니다. –

+0

@StuartMarks 'vecesQueSeRespite' 필드의 역 비교를 사용하도록 코드를 업데이트했습니다. – Bohemian

+0

더 나은,하지만 여전히 작동하지 않습니다. 그러나 노력을 위해 :-) +1. 타입 추론은'reversed()'가 사용될 때 무너지는 경향이 있습니다. 또한,'dameInterprete'는'GestionCancion'에 대한 메소드가 아니므로 메소드 참조 대신 람다를 사용해야합니다. 타입 유추 문제를 피하기 위해 람다 arg를위한 명시적인 타입의 람다를 작성해야했습니다. '(GestionCancion gc) -> gc.song.dameInterprete()'. 마지막으로,'vecesQueSeRepite'는 어떤 타입의 프리미티브처럼 보이므로,'comparisonInt' 또는 유사한 것이 반드시 boxing을 피하기 위해 사용되어야합니다. 그러나 그 결과는 원래의 답이나 다른 답보다 더 낫습니다. –