Java 8 如何用Nested Streams嵌套流筛选符合名称与Metadata条件的File id
Java 8 Stream 嵌套过滤实现方案
你可以通过第二层Stream调用anyMatch方法完成metadata的存在性校验,完整实现如下:
完整代码示例
首先假设你的File和Metadata类已经提供了对应字段的getter方法(如果字段为public可直接访问,替换代码中的getter调用为字段访问即可):
import java.util.List; import java.util.stream.Collectors; // 原有类定义,补充对应getter即可 class File { String id; String name; List<Metadata> metadata; public String getId() { return id; } public String getName() { return name; } public List<Metadata> getMetadata() { return metadata; } } class Metadata { String key; String value; public String getKey() { return key; } public String getValue() { return value; } } public class FileFilterDemo { public List<String> getHorrorMovieIds(List<File> files) { return files.stream() // 第一层过滤:匹配文件名称 .filter(file -> "movie.mp4".equals(file.getName())) // 第二层过滤:校验metadata是否存在符合要求的键值对 .filter(file -> file.getMetadata().stream() .anyMatch(metadata -> "genre".equals(metadata.getKey()) && "Horror".equals(metadata.getValue()) ) ) // 提取符合条件的文件id .map(File::getId) // Java 8 需用Collectors.toList(),Java 16+可直接替换为toList() .collect(Collectors.toList()); } }
逻辑说明
- 第一层
filter完成文件名筛选,和你现有实现逻辑一致 - 第二层
filter中,将每个文件的metadata列表转为Stream,调用anyMatch做存在性判断:只要metadata列表中存在任意一个满足key="genre"且value="Horror"的条目,当前文件就会被保留 - 最后通过
map提取符合条件的文件id,收集为List返回
如果只需要获取第一个匹配的文件id,可以将最后的收集逻辑替换为:
.findFirst().orElse(null);
找不到匹配项时会返回null,也可以用orElseThrow自定义不存在时的异常逻辑。
内容的提问来源于stack exchange,提问作者Ish
相关产品推荐
相关产品推荐

