Java 流 - 将流<Set<T>> 转换为流<T>

Java Streams - Convert Stream<Set<T>> to Stream<T>

我在处理流时遇到了一些问题。本质上,我有一个 Map<Integer, Bucket>,每个 Bucket 都有一个 Set<Node>。我想要做的是 return 一个 List<Node> 包含所有桶中的所有节点。目前,我正在使用 for 循环访问所有存储桶,并且对于每个存储桶,我将所有节点附加到一个列表中,如下所示。

public static synchronized List<Node> getNodes() {
        List<Node> nodes = new ArrayList<>();
        Collection<Bucket> bucketCollection = buckets.values();
        for (Bucket b : bucketCollection) {
            for (Node n : b.getNodes()) {
                nodes.add(n);
            }
        }
        return nodes;
    }

这是在做它应该做的事情。但是,我在使用流重写此函数时遇到了一些麻烦。我尝试了以下代码,但它不起作用,因为它是 returning List<Set<Node>> 而不是 List<Node>.

public static synchronized List<Node> getNodes() {
        return buckets.values().stream()
                .map(Bucket::getNodes)
                .collect(Collectors.toList());
    }

也就是说,在地图之后,我有一个 Stream<Set<Node>>,但在调用 collect(Collectors.toList()) 之前我需要有一个 Stream<Node>。我该怎么做?

map 将一个 'thingie' 变成另一个“东西”。 1 件事变成 1 件事。这不是你想要的;你想让 1 件事变成 0 到很多事情。您正在寻找的方法是 flatMap.

return buckets.values().stream()
  .map(Bucket::getNodes)
  .flatMap(Set::stream)
  .collect(Collectors.toList())
  ;