文字列は、Java 8 Streamsを使用して、重複する値ではないような地図<文字列、整数>に一覧<オブジェクト>変形

BibekのKr。Bazaz:

次のように私たちは、学生のクラスを持っています:

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<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));

このリストは、に変換する必要があるHashMap<String,Integer>ように:

  1. マップは重複学生が含まれていません
  2. 重複した生徒の名前が発見された場合、彼のマークは前の出現で追加されなければなりません。

出力がなければならないので、{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
                            )
            );

しかし、マージ機能は、私はマークを連結することはできません。また、これは、出力を返します。

出力がなければならないので、{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
                ));

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=172378&siteId=1