要反转映射,使其不同的值成为键,并将其键添加到相应值下的集合中,请groupingBy()在映射条目上使用。原始映射中的值必须正确实现equals()并hashCode()用作新哈希表中的键,这一点很重要。
static <K, V> Map<V, Set<K>> invert(Map<? extends K, ? extends V> original) {
return original.entrySet().stream()
.collect(Collectors.groupingBy(
Map.Entry::getValue,
Collectors.mapping(Map.Entry::getKey, Collectors.toSet())
));
}
如果你想对组进行排序,你可以创建一个专门的“下游”收集器:
static <K, V> Map<V, SortedSet<K>> invert(
Map<? extends K, ? extends V> original,
Comparator<? super K> order) {
Collector<K, ?, SortedSet<K>> toSortedSet =
Collectors.toCollection(() -> new TreeSet<>(order));
return original.entrySet().stream()
.collect(Collectors.groupingBy(
Map.Entry::getValue,
Collectors.mapping(Map.Entry::getKey, toSortedSet)
));
}
largeQ
12345678_0001
catspeake
相关分类