流分组:子列表到唯一的父列表

时间:2015-12-08 14:26:30

标签: java collections java-stream

我正在寻找一种简洁有效的方法,从使用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);
  }
}

首先,我从某种方法中获取Child对象的列表 孩子可能属于多个父母,父母可能会发生碰撞。

List<Child> children = getChildren();

然后:

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

所以它有效,但我想避免双流并收集。

这可以直接在一个流中使用吗?

3 个答案:

答案 0 :(得分:5)

这个怎么样:

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

答案 1 :(得分:2)

你应该试试这个

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

答案 2 :(得分:0)

这个怎么样?

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

没有溪流,但如果你确保实施可比较的话,应该解决问题。如果你实现了equals和hashcode,当然也可以使用HashSet。