我正在尝试在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)
信息流,但我没有得到估算结果。
答案 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;
}