我有一个对象 A(文件夹)的列表。该列表中的每个对象 A 都有一个对象 B(合作伙伴)列表,对象 B 还具有一个对象 C(人员)列表。对象 C 包含一个属性代码,我想用它来使用 java 8 进行过滤。
我已经尝试过下面的代码,但它似乎不起作用:
A objectA = new A();
String code = "O";
for (A a: listObjectsA) {
for (B b: a.getPartners()) {
for (C c: b.getPersonnes()) {
if (c.getCode().equalsIgnoreCase(code)) {
objectA = a;
break;
}
}
}
}
你们知道如何使用 FlatMap 进行从
List<A>
到 A
的这种转换吗?
我们在顶级流上使用过滤器,使用
anyMatch
检查内部流,因为您的搜索是查找任何匹配的对象:
A objectA = listObjectsA.stream().filter(a -> a.getPartners()
.stream()
.anyMatch(b -> b.getPersonnes()
.stream()
.anyMatch(c -> c.getCode().equalsIgnoreCase(code))))
.findFirst()
.orElseGet(A::new); //defaults to new A()
您不能使用简单的
flatMap
,因为它会将流依次转换为 B
和 C
类型,使得返回要返回的父 A
对象变得相当复杂。
它不起作用,因为
break
指令仅停止最后一个 for
循环。
您可以将
break
与标签一起使用,以准确停止您想要的循环。
A objectA = new A();
String code = "O";
loopA: for (A a: listObjectsA) {
for (B b: a.getPartners()) {
for (C c: b.getPersonnes()) {
if (c.getCode().equalsIgnoreCase(code)) {
objectA = a;
break loopA;
}
}
}
}
您可以使用
return
和 Optional
来封装该方法。
public class Example {
public String getObjectA() {
String code = "O";
for (A a: listObjectsA) {
for (B b: a.getPartners()) {
for (C c: b.getPersonnes()) {
if (c.getCode().equalsIgnoreCase(code)) {
return Optional.of(a);
}
}
}
}
return Optional.empty();
}
public static void main(String[] args) {
Optional<A> objectA = getObjectA();
}
}