2014-08-29 74 views
2

我正在遍歷一個圖形的邊緣,想要列出所有的源和目標。這是我到目前爲止:Java 8 Stream API收集器問題

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()); 
} 

乾杯,丹尼爾

回答

7
Set<Vertex> vertices = edges.stream() 
    .flatMap(e -> Stream.of(e.getSource(), e.getTarget())) 
    .collect(Collectors.toSet()); 
+0

太棒了,謝謝! – 2014-08-29 12:20:51

6

同比可以使用Misha的建議或手動編寫集:

Set<String> vertices = this.edges.stream() 
     .collect(HashSet::new, (set, edge) -> { 
      set.add(edge.getSource()); 
      set.add(edge.getTarget()); 
      }, Set::addAll);