Android Java中如何用Stream API的Lambda实现File数组复杂条件过滤
改写后的完整实现代码
private ArrayList<String> findPhotos(Date startTimestamp, Date endTimestamp, String keywords, String longitude, String latitude) { File[] fList = file.listFiles(); return Optional.ofNullable(fList) .map(Arrays::stream) .orElseGet(Stream::empty) // 时间范围过滤 .filter(f -> (startTimestamp == null && endTimestamp == null) || (f.lastModified() >= startTimestamp.getTime() && f.lastModified() <= endTimestamp.getTime())) // 关键词过滤 .filter(f -> keywords.isEmpty() || f.getPath().contains(keywords)) // 经度过滤 .filter(f -> longitude.isEmpty() || f.getPath().contains(longitude)) // 纬度过滤 .filter(f -> latitude.isEmpty() || f.getPath().contains(latitude)) // 提取文件路径 .map(File::getPath) // 收集为ArrayList返回,匹配原方法返回值类型 .collect(Collectors.toCollection(ArrayList::new)); }
核心说明
- 用
Optional.ofNullable处理file.listFiles()返回null的场景,和原逻辑的非空判断效果完全一致,避免空指针异常 - 拆分多维度过滤规则到独立
filter方法,比原嵌套条件可读性更强,完全匹配要求的过滤逻辑 - 最终用
Collectors.toCollection(ArrayList::new)直接返回ArrayList类型,无需额外类型转换,和原方法返回值定义对齐
需要导入的依赖类
import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream;
内容的提问来源于stack exchange,提问作者Aaron Lee
相关产品推荐
相关产品推荐

