I’m trying to see how I can sort a list using streams where items that exist in a separate hashset are moved to the front of the list.
Example:
Set<Object> set; List<Object> list;
I’m assuming I can use a lambda in streams.sorted() for this but I’m not able to figure out what this would look like.
sizes.stream()
.sorted((o1, o2) -> {
...
...
})
.collect(Collectors.toCollection(LinkedHashSet::new));
Advertisement
Answer
You can compare the boolean values which are returned by Set.contains and reverse the order just by negating it, since false < true. Example using strings:
Set<String> set = Set.of("foo","bar","baz");
List<String> list = List.of("doo","dee","daa","foo","baz","bar");
Set<String> set2 = list.stream()
.sorted((o1,o2) -> - Boolean.compare(set.contains(o1),set.contains(o2)))
.collect(Collectors.toCollection(LinkedHashSet::new));
But you can gain readablity if you use method refernce instead of lambda:
Set<String> set2 = list.stream()
.sorted(Comparator.comparing(set::contains).reversed())
.collect(Collectors.toCollection(LinkedHashSet::new));