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