2015-12-08 85 views
0

我正在尋找一個簡潔高效的方式來從使用Java 8流的兒童列表中獲取唯一父母列表。流分組:兒童列表到唯一的父列表

對於例如,我有這兩個簡單的類:

public class Child{ 
    private Parent parent; 
    public Child(Parent parent){ 
    this.parent = parent; 
    } 
    public Parent getParent(){ 
    return this.parent; 
    } 
} 

public class Parent{ 
    private List<Child> children; 
    public Parent(){ 
    this.children = new ArrayList<Child>(); 
    } 
    public void addChild(Child child){ 
    this.children.add(child); 
    } 
} 

首先,我得子對象的列表一些方法。
孩子可能屬於多個父母,可能與父母發生碰撞。

List<Child> children = getChildren(); 

然後:

List<Parent> uniqueParents = children 
    .stream() 
    .collect(Collectors.groupingBy(Child::getParent)) 
    .keySet() 
    .stream() 
    .collect(Collectors.toList()); 

所以它的工作原理,但我想避免雙流和收集。

這是可能的直接在一個流?

回答

5

如何:

List<Parent> uniqueParents = children 
    .stream() 
    .map(Child::getParent) 
    .distinct() 
    .collect(Collectors.toList()); 
+0

不錯,正是我想要的,謝謝 – singe3

0

這個怎麼樣?

Set<Parent> parents = new TreeSet<>(); 
    children.forEach(c -> parents.add(c.getParent())); 

這是沒有流,但應解決問題,如果你確保實施可比較。如果實現equals和hashcode,當然也可以使用HashSet。

+0

好吧,但我需要獨特家長的名單,所以我必須構築起集的一覽表我不想。我寧願立即獲得一份清單。 – singe3

+0

該集合將僅包含唯一元素。你可以通過list.addAll(父母)從這裏創建一個List。請注意,Sánder的答案也爲您提供了一套。 –

2

你應該試試這個

public Set<Parent> getUniqueParents() { 
     return children.stream().map(child -> child.getParent()).collect(Collectors.toSet()); 
    }