Java collect to list but specify pre-defined first two elements order

user1692342 :

I have a List<Person> objects. From it I want to get a list of all id's, and I always want the id "abc" and "bob" to come as the 0th and 1st index of the list if available. Is there a way to do this with java streams?

class Person {
   private String id;
}

List<Person> allPeople = ...
List<String> allIds = allPeople.stream().map(Person::id).collect(Collectors.toList());

My approach is:

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.
Eugene :

It seems like you need more of a PriorityQueue rather than a List here, so may be something like this:

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

If you still need a List though, just drain that pq into one:

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

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=74028&siteId=1
Recommended