Как вернуть объект Java-бина при выполнении нескольких групп в потоке - PullRequest
0 голосов
/ 11 мая 2019

Я использовал несколько групп, используя API потока Java, но его функцию карты результатов, но не смог преобразовать его в класс бина.я не знаком с написанием сбора сложных объектов с использованием лямбды.

Имея проблему с функцией groupedStudentSubjects, она не возвращает список объектов ученика с правильными данными, я не смог его настроить.Нужна помощь в этом.

.flatMap(e -> e.getValue().entrySet().stream()
                    .map(a -> new Student(e.getKey(), a.getKey(), 
                          a.getKey(),a.getKey(),a.getKey(),a.getKey())))
public class Student {
       String firstName;
       String Lastname;
       String id;
       String class_name;
       String section;
       String subject;
...
}

List<Student> students = new ArrayList<>();    
       students.add(new Student("Ram", "Kumar", "123", "12", "A", "MATH"));
       students.add(new Student("Ram", "Kumar", "123", "12", "A", "SCIENCE"));
       students.add(new Student("Ram", "Kumar", "123", "12", "A", "ENGLISH"));
       students.add(new Student("Shyam", "Kumar", "124", "12", "A", "MATH"));
       students.add(new Student("Shyam", "Kumar", "124", "12", "A", "SCIENCE"));
       students.add(new Student("Shyam", "Kumar", "124", "12", "A", "ENGLISH"));

public static List<Student> groupedStudentSubjects(List<Student> students) {

    return  students.stream()
                .collect(Collectors.groupingBy(Student::getFirstName,
                                Collectors.groupingBy(Student::getLastname,
                                        Collectors.groupingBy(Student::getId,
                                        Collectors.groupingBy(Student::getClass_name,
                                        Collectors.groupingBy(Student::getSection,
                                        Collectors.mapping(Student::getSubject, Collectors.joining(","))))))))

                .entrySet()
                .stream()
                .flatMap(e -> e.getValue().entrySet().stream()
                        .map(a -> new Student(e.getKey(), a.getKey(), a.getKey(),a.getKey(),a.getKey(),a.getKey())))
                .collect(Collectors.toList());
    }
}`

1 Ответ

3 голосов
/ 11 мая 2019

IMO, вы можете решить свою проблему простым способом. Просто переопределите equals() и hashCode() для класса ученика все свойства;и добавьте в класс некоторые конструкторы и методы, чтобы упростить ваши вещи.

public Student(Student student) {
    this.firstName = student.firstName;
    this.lastname = student.lastname;
    this.id = student.id;
    this.class_name = student.class_name;
    this.section = student.section;
}

и

public Student setSubject(String subject) {
    this.subject = subject;
    return this;
}

теперь вы можете использовать toMap коллектор с функцией слияния.

 Map<Student,String> map =
         students.stream()
            .collect(Collectors
                .toMap(Student::new, Student::getSubject, (v1, v2) -> v1.concat(",").concat(v2)));

и для создания нового объекта Student из предыдущего результата:

List<Student> result = map.entrySet().stream()
            .map(entry -> new Student(entry.getKey()).setSubject(entry.getValue()))
            .collect(Collectors.toList()); 

равно и hashCode:

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Student student = (Student) o;
    return Objects.equals(firstName, student.firstName) &&
            Objects.equals(lastname, student.lastname) &&
            Objects.equals(id, student.id) &&
            Objects.equals(class_name, student.class_name) &&
            Objects.equals(section, student.section);
}

@Override
public int hashCode() {
    return Objects.hash(firstName, lastname, id, class_name, section);
}

students.stream()
            .collect(Collectors.groupingBy(Student::new, Collectors.mapping(Student::getSubject, Collectors.joining(","))))
            .entrySet()
            .stream()
            .map(entry -> new Student(entry.getKey()).setSubject(entry.getValue()))
            .collect(Collectors.toList());

и ваше решение выглядит примерно так:

students.stream()
            .collect(Collectors.groupingBy(Student::getFirstName,
                    Collectors.groupingBy(Student::getLastname,
                            Collectors.groupingBy(Student::getId,
                                    Collectors.groupingBy(Student::getClass_name,
                                            Collectors.groupingBy(Student::getSection,
                                                    Collectors.mapping(Student::getSubject, Collectors.joining(","))))))))
            .entrySet()
            .stream()
            .flatMap(entry->entry.getValue().entrySet().stream()
            .flatMap(entry2->entry2.getValue().entrySet().stream()
            .flatMap(entry3->entry3.getValue().entrySet().stream()
            .flatMap(entry4->entry4.getValue().entrySet().stream()
            .map(entry5->new Student(entry.getKey(),entry2.getKey(),entry3.getKey(),entry4.getKey(),entry5.getKey(),entry5.getValue()))))))
            .collect(Collectors.toList());
...