返回

使用JDK采集器去除父/子嵌套集合的重复性

闲谈

使用嵌套集合(一个集合中的元素也是一个集合)在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]

使用收集器可以轻松地从嵌套集合中提取唯一元素,并根据不同的标准对这些元素进行排序。