我有 List<Person>
个对象 . 从中我想获得所有id的列表,并且我总是希望id "abc"和"bob"作为列表的第0和第1个索引(如果可用) . 有没有办法用java流做到这一点?
class Person {
private String id;
}
List<Person> allPeople = ...
List<String> allIds = allPeople.stream().map(Person::id).collect(Collectors.toList());
我的方法是:
Set<String> allIds = allPeople.stream().map(Person::id).collect(Collectors.Set());
List<String> orderedIds = new ArrayList<>();
if(allIds.contains("abc")) {
orderedIds.add("abc");
}
if(allIds.contains("bob")) {
orderedIds.add("bob");
}
//Iterate through the set and all add all entries which are not bob and abc in the list.
4 回答
看起来你需要更多
PriorityQueue
而不是List
,所以可能是这样的:如果你仍然需要
List
,只需将pq
排成一个:受Stuart Marks的启发,有一个更简单的解决方案:
如果您想在“完全”流管道中执行此操作,您可以执行以下操作:
如果你总是想在“鲍勃”面前“abc”然后改变
至
您可以做的另一个解决方案是:
这与上面的
partitioningBy
几乎完全相同,但只是采用了不同的方法 .最后,你可能会感到惊讶,但你的方法看起来确实很好,所以你可能想要完成它:
我假设每个id在列表中只出现一次 . 有了这个,我会选择一个简单直接的解决方案:
请注意,
"bob"
和"abc"
以相反的顺序移动到列表的开头 . 所以"abc"
最终是第一个 .您可以创建一个小实用程序方法来移动元素:
有了这个,您的代码更简单,更容易理解: