问题:对一个list根据元素的某一属性进行分组
方法一:传统的方式
private static Map<String, List<Student>> groupByColor(List<Student> list) {
HashMap<String, List<Student>> map = new HashMap<>();
for (Student student : list) {
List<Student> students = map.get(student.getColor());
if (students==null){
students=new ArrayList<>();
map.put(student.getColor(),students);
}
students.add(student);
}
return map;
}
方法二:使用map的自带的方法,结合lambda表达式
private static Map<String, List<Student>> groupByColorOptMap(List<Student> list) {
HashMap<String, List<Student>> map = new HashMap<>();
for (Student student : list) {
List<Student> students = map.computeIfAbsent(student.getColor(), k -> new ArrayList<>());
students.add(student);
}
return map;
}
方法三:使用stream流结合Optional类的巧妙结合
private static Map<String, List<Student>> groupByColorOpt(List<Student> list) {
Map<String, List<Student>> map = new HashMap<>();
list.forEach(student -> {
List<Student> colorList = Optional.ofNullable(map.get(student.getColor())).orElseGet(() -> {//得到一个空的list
List<Student> newList = new ArrayList<>();
map.put(student.getColor(), newList);
return newList;
});
colorList.add(student);
});
return map;
}
方法四:使用stream流式分组,返回key对list
Map<String, List<Student>> map = list.stream().collect(Collectors.groupingBy(Student::getColor));
方法五:使用流式返回一对一的结果
Map<String, Student> map = list.stream().collect(Collectors.toMap(info -> info.getColor(), Function.identity(), (p1, p2) -> p1));//p1,p2决定遇到重复保留哪一个