Java中如何从嵌套列表(List<ObjectA>含List<ObjectB>)返回匹配对象/属性?
使用Java Streams从嵌套列表中获取匹配对象/属性
当然可以用Streams实现需求,利用flatMap扁平化嵌套列表,结合filter做条件匹配,最后用findFirst()获取第一个匹配的元素(和anyMatch一样支持短路终止,保证效率)。以下是具体实现:
1. 获取匹配的ObjectC对象
import java.util.Objects; import java.util.Optional; // 获取第一个符合条件的ObjectC,返回Optional避免空指针 Optional<ObjectC> matchingObjectC = MasterObject.getListObjectA().stream() .filter(Objects::nonNull) // 过滤null的ObjectA实例 .flatMap(objectA -> objectA.getListObjectB().stream()) // 将所有ObjectB展开为单一流 .map(ObjectB::getObjectC) // 从ObjectB提取ObjectC .filter(Objects::nonNull) // 过滤null的ObjectC实例 .filter(objectC -> "rf".equals(objectC.getType()) && objectC.getLength() == 3) // 匹配条件 .findFirst(); // 找到第一个匹配项后立即终止流
2. 直接获取ObjectC的propertyID属性
如果只需要propertyID,可以在流中直接映射:
Optional<String> matchingPropertyId = MasterObject.getListObjectA().stream() .filter(Objects::nonNull) .flatMap(objectA -> objectA.getListObjectB().stream()) .map(ObjectB::getObjectC) .filter(Objects::nonNull) .filter(objectC -> "rf".equals(objectC.getType()) && objectC.getLength() == 3) .map(ObjectC::getPropertyID) // 提取propertyID .findFirst();
3. 获取匹配的ObjectB对象
如果需要先拿到ObjectB的引用,再从中提取ObjectC属性:
Optional<ObjectB> matchingObjectB = MasterObject.getListObjectA().stream() .filter(Objects::nonNull) .flatMap(objectA -> objectA.getListObjectB().stream()) // 直接在ObjectB层面做条件判断,同时避免ObjectC为null的情况 .filter(objectB -> objectB.getObjectC() != null && "rf".equals(objectB.getObjectC().getType()) && objectB.getObjectC().getLength() == 3) .findFirst(); // 从ObjectB中提取ObjectC的propertyID Optional<String> propertyIdFromB = matchingObjectB.map(b -> b.getObjectC().getPropertyID());
关键说明
flatMap:将嵌套的List<ObjectB>展开为连续的流,避免嵌套循环。findFirst():具有短路特性,找到第一个匹配元素后立即停止遍历,和你之前用的anyMatch效率一致。Optional:用来处理可能不存在匹配元素的情况,避免空指针异常,你可以通过ifPresent()、orElse()等方法处理结果。
内容的提问来源于stack exchange,提问作者try
相关产品推荐
相关产品推荐

