2017-11-20 10 views
2

リストをパラメータとして受け取り、その結果としてHashMapを返す関数をJava 8で作成しようとしています。リストを受け取り、リストHashMapを返すJava 8関数<K, List<V>>

私はすでにJavaの7でそれをやったが、私は、Java 8つのストリームを使用して、それをしたい:ここでは

は、Java 7のコードです:

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; 
} 

私はcollect(Collectors.toMap)ストリームと試みたが、I推定結果を得られなかった。

答えて

6

intを受け入れ、その平均値に対応するグループを返すメソッドを作成できます。あなたはこの基準によってグループにあなたのインスタンスをCollectors.groupingByを使用することができます

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"; 
    } 
} 

今:

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

代わりに、あなたはgetGroup()方法にEleveインスタンスを渡すことができますので、ストリームパイプラインはなります:

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

またはgetGroup()のインスタンスメソッドをEleve(つまり)にすると):

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

あなたはまたに2つ目のスニペットを短縮することができます: 'Eから - >のgetGroup(E)'工ass :: getGroup' – Lino

+1

@Linoうん 'へ私はどのクラスにそのメソッドが含まれているかを決定しなかったので、私はそれをしませんでした:) – Eran

+0

それは私がdummynameを考え出した理由です。それは可能であることだけを言いたかった。しかしもちろんあなたのためではない、あなたはそれが可能であることを知っている;) – Lino

1

ありがとうございました。

実際には、groupingByメソッドが解決策でした。

私は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の答えに満足しているなら、彼にそれを信用するためにそれを受け入れてください。 –

関連する問題