我正在寻找一种简洁有效的方法,从使用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());
所以它有效,但我想避免双流并收集。
这可以直接在一个流中使用吗?
答案 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。