使用Java8 Streams将Class Leader Id置于列表顶部



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

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

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

如果领导者的具体id等于123,您可以只使用过滤器来获取它

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

最新更新