作者:手机用户2502911627_202 | 来源:互联网 | 2022-11-20 17:40
如何解决《将List<Object>转换为Map<String,Integer>,使得String不是使用Java8Streams的重复值》经验,为你挑选了2个好方法。
我们有一个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;
}
}
我们有一份学生名单如下:
List 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));
此列表需要转换为以下HashMap
内容:
地图不包含任何重复的学生
如果找到重复的学生姓名,他的标记应与前一次出现相加.
所以输出应该是:{ABC = 67,DEF = 40}
我试图解决这个问题如下:
Map studentMap = studentList.stream()
.collect(
Collectors.toMap(
student->student.getStudentName().toLowerCase(),
student -> student.getMarks(),
(s1,s2) -> s1,
LinkedHashMap::new
)
);
但是合并函数不允许我连接标记,这会将输出返回为
所以输出应该是:{abc = 30,DEF = 40}
有人可以建议一个有效的解决方案吗?
1> Naman..:
这是因为合并函数不正确,您应该使用:
Map map = studentList.stream()
.collect(Collectors.toMap(
student->student.getStudentName().toLowerCase(),
Student::getMarks,
(s1,s2) -> s1 +s2, // add values when merging
LinkedHashMap::new
));
2> Eran..:
另一种解决方案是使用groupingBy
具有summingInt
:
Map studentMap =
studentList.stream()
.collect(Collectors.groupingBy(s -> s.getStudentName().toLowerCase(),
Collectors.summingInt(Student::getMarks)));