2014-08-29 2 views
2

Я просматриваю график по его краям и хочу иметь список всех источников и целей. Это то, что я до сих пор:Java 8 Stream API Collector Issue

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

Cheers, Даниэль

ответ

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

Удивительный, спасибо! –

6

Yoy можно использовать предложение Миши или написать коллектор вручную:

Set<String> vertices = this.edges.stream() 
     .collect(HashSet::new, (set, edge) -> { 
      set.add(edge.getSource()); 
      set.add(edge.getTarget()); 
      }, Set::addAll); 
Смежные вопросы