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())
;
我在处理流时遇到了一些问题。本质上,我有一个 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())
;