Как получить уникальный список объектов с самой высокой датой события в поле event_date в коллекции Iterable <Student> - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть Iterable<Student> studentList, который содержит студенческие объекты с полями id, event_date и многими другими.

Iterable<Student> myStudentList (contains student objects);

Теперь этот список студентов содержит множество объектов для одного идентификатора студента.Допустим, мне нужно изменить этот список учеников так, чтобы он содержал только несколько объектов учеников (по одному на один идентификатор ученика, и этот объект ученика должен содержать максимальное значение event_date для всех объектов ученика для его student_id).Как мне сделать это эффективно?

Например.В настоящее время список содержит следующие элементы:

ListIndex  |  Student ID | Student Name | Student Event Date |
0            RV001         Mahesh          1328532774000
1            RV002         James           1328532774000
2            RV002         James           1454763174000
3            RV002         James           1549457671000
4            RV001         Mahesh          1549457671000
5            RV003         Andy            1454763174000

Ожидаемый результат

И теперь мой результат Iterable<Student> список должен содержать ниже как результат

ListIndex  |  Student ID | Student Name | Student Event Date |
0            RV001         Mahesh          1549457671000
1            RV002         James           1549457671000
2            RV003         Andy            1454763174000

Как мне добиться этого эффективно, используя Java 8?

Эти данные поступают из таблицы, которая разделена на event_date

Мой подход в настоящее время, о котором я могу думать:-P

Step 1 - Create a HashMap<Student_id, List<Student>>
Step 2 - Create a final List<Student> finalList for result purpose.
Step 2 - Iterate through the List<Student> 
    (a) For each student_id , store the list of Student objects in the  
        Map
         -- END of Iterating List<Student>
Step 3 - Iterate Each Map Entry in HashMap 
        (a) For every key , Apply Comparator on List<Student> for 
         current student id.
        (b) Get the first object of List<Student> in map for current 
            student_id and add it to the final list

Дайте мне знать, если у вас есть лучшие подходы.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Аналогично ответу @nullpointer, но при условии, что дата события имеет тип int, long или double, вы можете использовать maxBy в нисходящем направлении с comparingInt, comparingLong или comparingDouble компаратором

studentList.stream()
    .collect(groupingBy(Student::getId, 
             maxBy(Comparator.comparingLong(Student::getEventDate))))
    .values()
    .stream()
    .map(Optional::get)
    .collect(toList());
0 голосов
/ 06 февраля 2019

Возможно, вы просто ищете что-то вроде:

List<Student> finalList = students.stream()
        // group by Id, value as List
        .collect(Collectors.groupingBy(Student::getId, 
        // reduce the list of values to only one with greater event_date 
                Collectors.reducing((student, student2) -> 
                        student.getEvent_date() > student2.getEvent_date() ? student : student2)))
        .values() // stream only such values
        .stream()
        .map(Optional::get)
        .collect(Collectors.toList()); // collect to list

Или, как указал Хольгер, вы можете использовать

.collect(Collectors.toMap(Student::getId, Function.identity(), 
                  (s1, s2) -> s1.getEvent_date() > s2.getEvent_date() ? s1: s2))

, для этого вам понадобится обернуть значения картыобразуется здесь в пределах new ArrayList<>().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...