使用 Java8 流将 Class 领导者 ID 置于列表顶部

Bring Class Leader Id on top of the list using Java8 Streams

我有一个学生列表,我只想将 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"}]

如果领导者有一个具体的 id 等于 123,你可以只使用过滤器得到它

List leaderStudents = students.stream().filter(s1 -> leaderId.equals(s1.getId()).collect(Collectors.toList());

您必须首先编写自己的比较器,在使用它进行排序时将领导者放在列表的前面。然后你必须用它来对列表进行排序。我看不出在这里使用流有任何意义,因为迭代代码看起来更简单和可读。这是它在实践中的样子。

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.

根据下面的评论,您可以将其进一步简化为这一行:

students.sort(Comparator.comparing(s -> s.getId() != leaderId));