извлеките несколько сопоставленных значений из вложенного списка с помощью Java 8

#java #java-8 #java-stream

Вопрос:

Я пытаюсь получить имена студентов для соответствующих университетов, где студенческий билет должен быть больше 1, используя java 8. Я не могу получить название университета и имя студента вместе в качестве вывода, используя карту из java 8, поскольку университет имеет вложенный список студентов, я попытался использовать приведенный ниже код, но смог получить только имя студента. Как я могу сопоставить название университета и имя студента вместе?

 List<String> studentList =  uniList.stream().flatMap(x->x.getStudents().stream())
                                    .filter(stu->stu.getSid()>1)
                                    .map(student -> student.getName())
                                    .collect(Collectors.toList());
 

Я создал Студенческие и университетские классы pojo и Класс реализации.

 Expected output is in below format:
University_name_1 : student_name_1, student_name_2, student_name_3 ...
University_name_2 : student_name_1, student_name_2, student_name_3 ...
 

University.java

 public class University {

    private int uid;
    private String name;
    private List<Student> students;
    
    //getter and setter
}
 

Student.java

 public class Student {

    private int sid;
    private String name;

    //getter and setter
}
 

Impl.java

 public class Impl {

    public static void main(String[] args) {
        
        Student s1 = new Student(1, "Sam");
        Student s2 = new Student(1, "Daniel");

        List students = new ArrayList();
        students.add(s1);
        students.add(s2);

        University uni = new University();
        uni.setUid(1);
        uni.setName("AJIT");
        uni.setStudents(students);

        Student s3= new Student(2, "shahrukh");
        Student s4= new Student(2, "simran");

        List students1 = new ArrayList();
        students1.add(s3);
        students1.add(s4);

        University uni2 = new University();
        uni2.setUid(2);
        uni2.setName("NJIT");
        uni2.setStudents(students1);

        List<University> uniList = new ArrayList();
        uniList.add(uni);
        uniList.add(uni2);
        
        List<String> studentList =  uniList.stream().flatMap(x->x.getStudents().stream())
                                    .filter(stu->stu.getSid()>1)
                                    .map(student -> student.getName())
                                    .collect(Collectors.toList());
        
        System.out.println(studentList);

    }

}
 

Комментарии:

1. Загляните в коллекционеров.Группируйтесь.

Ответ №1:

Вам нужно а Map<String, List<String>> вместо а List<String> .

 Map<String, List<String>> map = 
    uniList.stream()                        
            .collect(Collectors.toMap(
                        University::getName, 
                        u -> u.getStudents()
                                  .stream()
                                  .filter(s -> s.getSid() > 1)
                                  .map(Student::getName)
                                  .collect(Collectors.toList())
                    )
            );

System.out.println(map);
 

Выход:

 {NJIT=[shahrukh, simran], AJIT=[]}
 

Кроме того, не используйте необработанный тип (например List students = new ArrayList() ); вместо этого используйте универсальный тип (например List<Student> students = new ArrayList<>() ).

Комментарии:

1. ОП хотел также отфильтровать идентификатор учащихся, чтобы он был больше 1. Тем не менее, я не понимаю, как идентификатор может быть меньше 1, но мне интересно, соответствует ли ваш пост тому, чего хотел ОП

2. .filter(stu->stu.getSid()>1) в вопросе не похоже на тот же фильтр в ответе

Ответ №2:

Попробуйте это

 Map<String, List<String>> result = uniList.stream().collect(Collectors.toMap(
            key::getName, 
            value -> value.getStudents()
                          .stream()
                          .filter(student -> student.getId() > 1)
                          .map(student -> student.getName())
                          .collect(Collectors.toList())));