Bib*_*zaz 6 java list hashmap java-stream collectors
我们有一个Student课程如下:
class Student{
private int marks;
private String studentName;
public int getMarks() {
return marks;
}
public void setMarks(int marks) {
this.marks = marks;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public Student(String studentName, int marks) {
this.marks = marks;
this.studentName = studentName;
}
}
Run Code Online (Sandbox Code Playgroud)
我们有一份学生名单如下:
List<Student> studentList = new ArrayList<>();
studentList.add(new Student("abc", 30));
studentList.add(new Student("Abc", 32));
studentList.add(new Student("ABC", 35));
studentList.add(new Student("DEF", 40));
Run Code Online (Sandbox Code Playgroud)
此列表需要转换为以下HashMap<String,Integer>内容:
所以输出应该是:{ABC = 67,DEF = 40}
我试图解决这个问题如下:
Map<String,Integer> studentMap = studentList.stream()
.collect(
Collectors.toMap(
student->student.getStudentName().toLowerCase(),
student -> student.getMarks(),
(s1,s2) -> s1,
LinkedHashMap::new
)
);
Run Code Online (Sandbox Code Playgroud)
但是合并函数不允许我连接标记,这会将输出返回为
所以输出应该是:{abc = 30,DEF = 40}
有人可以建议一个有效的解决方案吗?
这是因为合并函数不正确,您应该使用:
Map<String, Integer> map = studentList.stream()
.collect(Collectors.toMap(
student->student.getStudentName().toLowerCase(),
Student::getMarks,
(s1,s2) -> s1 +s2, // add values when merging
LinkedHashMap::new
));
Run Code Online (Sandbox Code Playgroud)
另一种解决方案是使用groupingBy具有summingInt:
Map<String, Integer> studentMap =
studentList.stream()
.collect(Collectors.groupingBy(s -> s.getStudentName().toLowerCase(),
Collectors.summingInt(Student::getMarks)));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |