Java 8函数,它接受List <v>并返回HashMap <k,list <v =“”>&gt;

时间:2017-11-20 09:27:02

标签: java lambda collections java-stream

我正在尝试在Java 8中创建一个函数,该函数将列表作为参数并返回HashMap作为结果。

我已经在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)信息流,但我没有得到估算结果。

2 个答案:

答案 0 :(得分:6)

您可以创建一个接受int平均值的方法,并返回该平均值的相应组。

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.getAverage())));

或者,您可以将Eleve实例传递给getGroup()方法,因此流管道将变为:

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

或者,如果您使getGroup()成为Eleve的实例方法(即public String getGroup() {...}):

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

答案 1 :(得分: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;
        }