2

我正在通过它的边缘遍历一个图,并希望有一个所有源和目标的列表。这是我到目前为止所拥有的:

public Set<Vertex> getVertices(){

    Set<Vertex> vertices = this.edges.stream().map(edge -> edge.getSource()).collect(Collectors.toSet());
    vertices.addAll(this.edges.stream().map(edge -> edge.getTarget()).collect(Collectors.toSet()));
    return vertices;
}

有没有办法在同一个映射/收集步骤中同时获取源和目标?类似(伪代码):

edges.stream().collect(edge.getSource()).collect(edge.getTarget())

或普通的旧 Java 7

for ( Edge e : edges ){
    vertices.add(e.getSource());
    vertices.add(e.getTarget());
}

干杯,丹尼尔

4

2 回答 2

7
Set<Vertex> vertices = edges.stream()
    .flatMap(e -> Stream.of(e.getSource(), e.getTarget()))
    .collect(Collectors.toSet());
于 2014-08-29T12:13:22.343 回答
6

Yoy 可以使用 Misha 的建议或手动编写收集器:

Set<String> vertices = this.edges.stream()
       .collect(HashSet::new, (set, edge) -> {
            set.add(edge.getSource());
            set.add(edge.getTarget());
          }, Set::addAll);
于 2014-08-29T12:20:25.597 回答