返回
使用JDK采集器去除父/子嵌套集合的重复性
闲谈
2023-11-06 02:36:38
使用嵌套集合(一个集合中的元素也是一个集合)在Java中很常见,例如,可能需要存储文件系统中的文件和目录。让我们考虑一个这样的嵌套集合:
Set<Set<String>> nestedSet = new HashSet<>();
Set<String> level1 = new HashSet<>();
level1.add("A");
level1.add("B");
Set<String> level2 = new HashSet<>();
level2.add("C");
level2.add("D");
nestedSet.add(level1);
nestedSet.add(level2);
如果我们尝试打印这个嵌套集合,我们会得到:
[[A, B], [C, D]]
但是,如果我们想获得一个包含所有元素的集合,而不包括重复的元素,我们可以使用JDK收集器。
Set<String> uniqueElements = nestedSet.stream()
.flatMap(Set::stream)
.collect(Collectors.toSet());
这将产生以下结果:
[A, B, C, D]
Collectors.toSet()
收集器将流中的所有元素收集到一个集合中,而Set::stream
方法将嵌套集合中的每个子集转换为一个流。
收集器还可以用于从嵌套集合中提取唯一元素。例如,以下代码将从嵌套集合中提取所有唯一元素,并根据每个元素的长度进行排序:
List<String> uniqueElements = nestedSet.stream()
.flatMap(Set::stream)
.distinct()
.sorted(Comparator.comparingInt(String::length))
.toList();
这将产生以下结果:
[A, B, C, D]
收集器还可以用于从嵌套集合中提取唯一元素,并根据每个元素的自然顺序进行排序。例如,以下代码将从嵌套集合中提取所有唯一元素,并根据每个元素的自然顺序进行排序:
List<String> uniqueElements = nestedSet.stream()
.flatMap(Set::stream)
.distinct()
.sorted()
.toList();
这将产生以下结果:
[A, B, C, D]
使用收集器可以轻松地从嵌套集合中提取唯一元素,并根据不同的标准对这些元素进行排序。