Java收集列表但指定预定义的前两个元素顺序

标签 java java-8 java-stream comparator

我有一个 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.

最佳答案

看起来你需要更多的 PriorityQueue 而不是 List 这里,所以可能是这样的:

PriorityQueue<String> pq = list.stream()
            .map(Person::getId)
            .distinct()
            .collect(Collectors.toCollection(() -> new PriorityQueue<>(
                    Comparator.comparing(x -> !"abc".equals(x))
                            .thenComparing(x -> !"bob".equals(x)))));

如果你仍然需要一个 List,只需将 pq 变成一个:

List<String> result = new ArrayList<>();
while (!pq.isEmpty()) {
   result.add(pq.poll());
}

关于Java收集列表但指定预定义的前两个元素顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53691061/

相关文章:

Java 递归文件列表为空格名称文件夹返回 null

Java - 如何告诉所有子线程都完成了

java - 我如何使用 Stream 改进此 List 迭代?

java - 有没有办法从 URL 字节流的特定位置开始读取?

java - 当 ForkJoinPool 结束时

java - 如何在android studio中修复不同的drawable

java - Wikipedia API - 获取搜索结果的链接

java - Spring FactoryBean 和作用域协同工作

Java 8 与流中的过滤器相反

java - map 上的流不保存 .map 更改