如何从 Java 8 中的对象列表中提取对象?

问题描述 投票:0回答:2

我有一个对象 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
的这种转换吗?

java for-loop java-stream break
2个回答
2
投票

我们在顶级流上使用过滤器,使用

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
对象变得相当复杂。


2
投票

它不起作用,因为

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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.