У меня есть список студентов, и я хочу вывести только leaderId на вершину того же списка, после чего остаются оставшиеся элементы списка с использованием Java Streams. Я попробовал приведенную ниже логику, но она не работает должным образом.

List<Student> students = ....

Long leaderId = 123;

students.stream().sort((s1,s2) -> leaderId.equals(s1.getId()) || leaderId.equals(s2.getId()) ? 1: 0).collect(Collectors.toList());

Может ли кто-нибудь дать мне какое-нибудь предложение по этому поводу

Примере

Список студентов:

[{id:121, name:"John"}, {id:131, name:"Susan"}, {id:123, name:"Jacob"}, {id:155, name:"Sunny"}]

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

[{id:123, name:"Jacob"}, {id:121, name:"John"}, {id:131, name:"Susan"}, {id:155, name:"Sunny"}]
1
Alex Man 8 Июн 2021 в 16:44

2 ответа

Лучший ответ

Сначала вы должны написать свой собственный компаратор, который помещает лидера в начало списка при его сортировке. Затем вы должны использовать его для сортировки списка. Я не вижу здесь смысла использовать потоки, поскольку итеративный код выглядит более простым и читаемым. Вот как это выглядит на практике.

static class LeaderFirstComparator implements Comparator<Student> {
    final long leaderId;

    LeaderFirstComparator(long leaderId) {
        this.leaderId = leaderId;
    }

    @Override
    public int compare(Student o1, Student o2) {
        if (o1.id == leaderId && o2.id != leaderId)
            return -1;
        else if (o1.id != leaderId && o2.id == leaderId)
            return 1;
        else
            return 0;
    }

}

И клиентский код:

students.sort(new LeaderFirstComparator(leaderId));

Обновить

Если первый объект является лидером, то он должен стоять перед вторым, следовательно, возвращается -1 в соответствии с контрактом. В противном случае, если второй объект является лидером, то первый должен следовать за ним, следовательно 1. Если ни один из объектов является лидером или оба являются лидерами, то первоначальный порядок сохраняется. Таким образом, возвращая 0.

1
Ravindra Ranwala 8 Июн 2021 в 17:01

Если у лидера конкретный идентификатор равный 123, вы можете получить его, используя только фильтр

List leaderStudents = students.stream().filter(s1 -> leaderId.equals(s1.getId()).collect(Collectors.toList());
0
JArgente 8 Июн 2021 в 13:51