Transform a List<Object> to a Map<String, Integer> such that the String is not a duplicate value using Java 8 Streams
That's because of an incorrect merge function, you should instead use:
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));
An alternative solution is to use groupingBy
with summingInt
:
Map<String, Integer> studentMap = studentList.stream()
.collect(Collectors.groupingBy(
s -> s.getStudentName().toLowerCase(),
Collectors.summingInt(Student::getMarks)));
Your merge function is incorrect. It could be either (s1, s2) -> s1 + s2
or just Integer::sum
if you'd rather use a method reference.
Another way to do it is without streams:
Map<String, Integer> studentMap = new LinkedHashMap<>();
studentList.forEach(s -> studentMap.merge(
s.getStudentName().toLowerCase(),
s.getMarks(),
Integer::sum));
This iterates the list of students and uses the Map.merge
method to group them by name, summing their marks.