Java按内部列表值分组

时间:2018-06-09 10:13:14

标签: java collections java-8 java-stream

class A {    
    private Collection<B> b;    
}

class B {
    String field;
    private Collection<C> c;
}

class C {
    String Name;
}

现在我想通过循环集合C并传递B作为参数来检查类name(Name)中的值是否相等。我们如何使用Java中的流来实现这一目标?

2 个答案:

答案 0 :(得分:1)

您可以按如下方式获得结果:

List<C> result = myList.stream()
            .flatMap(a -> a.getB().stream())
            .flatMap(b -> b.getC().stream())
            .filter(c -> Objects.equals(c.getName(), searchName))
            .collect(Collectors.toList());

这将从myList(List<A>)创建一个流,然后连续展平嵌套集合以获取Stream<C>,然后返回提供C的{​​{1}}个对象然后最终将其收集到列表实例。

答案 1 :(得分:0)

这将通过过滤列表C来创建列表A,其名称等于yourName

List<A> listA = ...

List<C> filteredA = listA.stream()
     .map(A::getB)
     .flatMap(Collection::stream)
     .map(B::getC)
     .flatMap(Collection::stream)
     .filter(c -> yourName.equals(c.getName()))
     .collect(Collectors.toList());