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()。equals(“ C1”))过滤
答案 0 :(得分: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()));
});
答案 1 :(得分: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());
答案 2 :(得分: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使其更具可读性。
答案 3 :(得分:-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());