2017-11-20 6 views
2

Java 8에서 매개 변수로 목록을 사용하고 결과적으로 HashMap을 리턴하는 함수를 작성하려고합니다. 나는 collect(Collectors.toMap) 스트림하지만 함께 노력List <V>리스트를 취하여 HashMap을 반환하는 Java 8 함수 >

public static HashMap<String, List<Eleve>> getMentions(List<Eleve> liste){ 

    HashMap<String, List<Eleve>> listeMentions = new HashMap<String, List<Eleve>>(); 

    List<Eleve> noMention = new ArrayList<Eleve>(); 
    List<Eleve> mentionAB = new ArrayList<Eleve>(); 
    List<Eleve> mentionB = new ArrayList<Eleve>(); 
    List<Eleve> mentionTB = new ArrayList<Eleve>(); 


    for (Eleve eleve: liste) { 
     if (eleve.getAverage()>=12 && eleve.getAverage()<14) {mentionAB.add(eleve);} 
     else if(eleve.getAverage()>=14 && eleve.getAverage()<16) {mentionB.add(eleve);} 
     else if (eleve.getAverage()>=16) {mentionTB.add(eleve);} 
     else{noMention.add(eleve);} 
    } 

    listeMentions.put("No mention", noMention); 
    listeMentions.put("Mention AB", mentionAB); 
    listeMentions.put("Mention B", mentionB); 
    listeMentions.put("Mention TB", mentionTB); 

    return listeMentions; 
} 

:

이미 자바 7에 그것을했다하지만 난 자바 8 스트림을 사용하여 작업을 수행 할 : 자바 7의 코드는 여기에

입니다 예상 결과를 얻지 못했습니다.

답변

6

int 평균을 허용하고 해당 평균에 해당하는 그룹을 반환하는 메서드를 만들 수 있습니다.

Map<String, List<Eleve>> listeMentions = 
    liste.stream() 
     .collect(Collectors.groupingBy(e -> getGroup(e.getAverage()))); 

다른 방법으로, 당신은 getGroup() 방법에 Eleve 인스턴스를 전달 할 수 있으므로 스트림 파이프 라인이 될 것이다 :

public static String getGroup (int average) { 
    if (average >= 12 && average < 14) { 
     return "Mention AB"; 
    } else if(average >= 14 && average < 16) { 
     return "Mention B"; 
    } else if (average >= 16) { 
     return "Mention TB"; 
    } else { 
     return "No mention"; 
    } 
} 

지금 당신은이 기준에 따라 그룹에 인스턴스를 Collectors.groupingBy을 사용할 수 있습니다

Map<String, List<Eleve>> listeMentions = 
    liste.stream() 
     .collect(Collectors.groupingBy(e -> getGroup(e))); 

) :

Map<String, List<Eleve>> listeMentions = 
    liste.stream() 
     .collect(Collectors.groupingBy(Eleve::getGroup)); 
+0

또한 두 번째 조각을 단축 할 수있다 : 전자'에서 - SomeClass'에> getGroup (e)에':: getGroup' – Lino

+1

@Lino 네 , 어떤 수업이 그 방법을 포함할지 결정하지 않았기 때문에 나는 그것을하지 않았다 :) – Eran

+0

그래서 나는 dummyname을 생각해 냈다. 가능한 일이라고 언급하고 싶었습니다. 하지만 물론 가능하지는 않습니다.) – Lino

1

도움을 주셔서 감사합니다.

실제로 그룹핑 방법이 해결책이었습니다.

ENUM을 만든 다음 증기에 사용하는 대신 동일한 방법으로 작동합니다. 여기 코드입니다 :

public enum Mention 
{ 
    BIEN, ASSEZ_BIEN,TRES_BIEN, BOF; 

    public static Mention find(double average) { 
    if (average >= 12 && average < 14) { 
      return ASSEZ_BIEN; 
     } else if(average >= 14 && average < 16) { 
      return BIEN; 
     } else if (average >= 16) { 
      return TRES_BIEN; 
     } else { 
      return BOF; 
     } 
} 

}

public static Map<Object, List<Eleve>> getMentions8(List<Eleve> liste){ 
      Map<Object, List<Eleve>> listeMentions = 
        liste.stream() 
         .collect(Collectors.groupingBy(e -> Mention.find(e.average))); 
      return listeMentions; 
     } 
+0

왜'Map >'이 될까요? 대신'Map >'이어야합니다. 이상적으로,지도 공급 업체를 받아들이는'Collectors.groupingBy'의 오버로드 된 버전을 사용해야하는'EnumMap'. –

+0

당신이 Eran의 대답에 만족하면 그에게 신용을주기 위해 그것을 받아주십시오. –