使用 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));
我有一个学生列表,我只想将 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));