如何在Java 8中过滤掉嵌套的List

问题描述 投票:-3回答:4
package com.example.java;

public class C {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "C [name=" + name + "]";
    }
}

package com.example.java;

import java.util.List;

public class B {

    List<C> listC;

    public List<C> getListC() {
        return listC;
    }

    public void setListB(List<C> listC) {
        this.listC = listC;
    }

    @Override
    public String toString() {
        return "B [listC=" + listC + "]";
    }
}

package com.example.java;

import java.util.List;

public class A {

    List<B> listB;

    public List<B> getListB() {
        return listB;
    }

    public void setListB(List<B> listB) {
        this.listB = listB;
    }

    @Override
    public String toString() {
        return "A [listB=" + listB + "]";
    }
}

我有一个A类对象的列表,想要过滤出名称为“C1”的C

列表A - > B列表 - > C列表(过滤掉,如果c.getName()。等于(“C1”))

java
4个回答
0
投票

假设您要修改现有列表,请不要创建新的列表实例:

A a = ...
for (B b : a.getListB()){
    Iterator<C> iterator = b.getListC().iterator();
    while(iterator.hasNext()) {
        if (iterator.next().getName().equals("C1")) {
            iterator.remove();
        }
    }
}

或者,如果您想使用流并创建新的筛选列表:

A a = ...
a.getListB().forEach(b -> {
    b.setListB(b.getListC().stream()
     .filter(c -> !c.getName().equals("C1"))
     .collect(Collectors.toList()));
});

0
投票

你可以很容易地使用流做到这一点,你唯一需要做的就是flatMap和流内部列表,最后获得一个Stream<C>。然后,您可以继续使用name属性过滤掉该流。

var someList = List.of(new A(), new A());
var filtered = someList
        .stream()
        .flatMap(a -> a.getListB().stream())
        .flatMap(b -> b.getListC().stream())
        .filter(((Predicate<? super C>) c -> c.getName().equals("something")).negate())
        .collect(Collectors.toList());

0
投票

如果只关注C的对象,可以使用以下命令:

 list.stream().forEach( a -> {
            a.getListB().stream().forEach( b -> {
                b.getListC().stream().filter(c -> c.getName().equals("C1")).forEach( c-> {
                    // Write your code.
                });
            } );
        });

您还可以使用method reference使其更具可读性。


-1
投票
        A a0=new A();
        A a1=new A();

        List<A> sourceList = Arrays.asList(a0, a1);

        B b0= new B();
        B b1= new B();
        B b2= new B();
        B b3= new B();

        C c0=new C();
        C c1=new C();
        C c2=new C();
        C c3=new C();

        c0.name="ciao";
        c1.name="C1";
        c2.name="hello";
        c3.name="C1";


        b0.listC=new ArrayList(){{add(c0); add(c1);}};
        b1.listC=new ArrayList(){{add(c2); add(c3);}};

        a0.listB=new ArrayList(){{add(b0); add(b1);}};
        a1.listB=new ArrayList(){{add(b2); add(b3);}};


          //ALL A THAT CONTAINS C1    
    List<A> allAContainsC1Objects =  sourceList
            .stream().filter( a-> Optional.ofNullable(a.getListB()).orElseGet(()-> new ArrayList<>()).stream()
                    .filter(b->Optional.ofNullable(b.getListC()).orElseGet(()-> new ArrayList()).stream()
                            .filter(c-> ((C)c).getName().equals("C1")).count()>0)
                    .count()>0).collect(Collectors.toList());


    //ALL C OBJECT C1
    List<C> allCObjectMatchedC1 = sourceList.stream().filter(a -> Optional.ofNullable(a.getListB()).isPresent())
            .flatMap(a -> a.getListB().stream())
            .filter(b -> Optional.ofNullable(b.getListC()).isPresent())
            .flatMap(b -> b.listC.stream())
            .filter(c-> Optional.ofNullable(c.getName()).isPresent()&&c.name.equals("C1"))
            .collect(Collectors.toList());

  //ALL A OBJECT WITH C1 only  
  final  List<A>  AllAObjectWithC1Only=  sourceList
          .stream()
          .filter( a-> Optional.ofNullable(a.getListB()).orElseGet(()-> 
          new ArrayList<>()).stream()
                  .filter(b->Optional
                  .ofNullable(b.getListC()).isPresent())
                  .peek(b-> {
                      Iterator<C> i = b.getListC().iterator();
                      while (i.hasNext()) 
                   {if(i.next().getName().equals("C1")==false) 
                  {i.remove();}}
                  } ).count()>0).collect(Collectors.toList());
© www.soinside.com 2019 - 2024. All rights reserved.