如何使用Java 8 Stream API过滤集合中的列表

时间:2016-06-09 15:09:06

标签: java collections java-stream

estimateCameraParameters

有一组对象A.

对象A包含对象B的列表.B具有布尔属性名称'标记' 使用java 8 streams API,如何过滤上面的集合,使其包含B列表,其中布尔标志仅为true。 即b3应从list1中删除。 为了简单起见,只需添加单个值。

3 个答案:

答案 0 :(得分:4)

您的班级B包含A列表;目标是在每个B中删除与条件匹配的所有A

第一个解决方案是制作一组A s的流,并将其中的每一个映射到新的B,其中A(List<B> b)列表已被过滤。假设有一个构造函数List<B> getB()和相应的getter(类A中的boolean isFlag();类B中的Set<A> set = new HashSet<>(); Set<A> filtered = set.stream() .map(a -> new A(a.getB().stream().filter(B::isFlag).collect(Collectors.toList()))) .collect(Collectors.toSet()); ),您可以:

B

如果您可以就地修改set.forEach(a -> a.getB().removeIf(b -> !b.isFlag())); 列表而不是创建新列表,则可以使用第二种解决方案。在这种情况下,您可以:

B

将删除每个false标记为A的所有<div class="well"> {{ form_start(form ) }} {{ form_errors(form) }} {{ form_row(form.firstName,{'attr':{'class':'your own class''}}) }} {{ form_row(form.lastName,{'attr':{'class':'your own class''}}) }} {{ form_row(form.login,{'attr':{'class':'your own class''}}) }} {{ form_row(form.password,{'attr':{'class':'your own class''}}) }} {{ form_row(form.tel,{'attr':{'class':'your own class''}}) }} {{ form_row(form.email,{'attr':{'class':'your own class''}}) }} {{ form_row(form.address,{'attr':{'class':'your own class''}}) }} {{ form_widget(form.send, {'attr': {'class': 'btn btn-primary'}}) }} {{ form_rest(form) }} {{ form_end(form) }} </div>

答案 1 :(得分:1)

    @org.junit.Test
    public void test() {
        B b1 = new B(true);
        B b2 = new B(true);
        B b3 = new B(false);

        List<B> list1 = new ArrayList();
        list1.add(b1);
        list1.add(b2);
        list1.add(b3);

        Set<A> a = new HashSet();
        a.add(new A(list1));

        a.stream().forEach(aa -> aa.setB(aa.getB().stream().filter(B::isFlag).collect(Collectors.toList())));

        System.out.println(a);
    }

输出:

[A{b=[B{flag=true}, B{flag=true}]}]

答案 2 :(得分:0)

a.stream().forEach(l -> l.removeIf(b -> !b.getFlag()));