Lambda表达式中的else子句使用问题——PDF遍历场景
关于Java流中forEach场景添加else逻辑的解答
嘿,这个问题问得很实在!咱们先拆解下你当前代码的逻辑:你用Files.walk(rootDir)遍历指定目录下的所有文件,接着通过filter(matcher::matches)只保留PDF格式的文件,最后用forEach(Start::modify)对每个匹配的文件执行静态方法。
那能不能在这个lambda的使用场景里加else子句呢?直接在原来的forEach后面加肯定不行——因为filter已经把非PDF文件都过滤掉了,forEach里根本碰不到那些不符合条件的文件,自然没有“else”的落脚处。不过要实现“处理PDF文件+处理非PDF文件”的逻辑,咱们有两种靠谱的办法:
方法一:把判断逻辑移到forEach内部
去掉filter步骤,在forEach的lambda表达式里直接做条件判断,这样就能同时处理匹配和不匹配的情况:
public static void run(String arg) { Path rootDir = Paths.get(arg); PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:**.pdf"); Files.walk(rootDir) .forEach(path -> { if (matcher.matches(path)) { Start.modify(path); } else { // 这里写你需要的else逻辑,比如打印非PDF文件路径 System.out.println("非PDF文件:" + path.toString()); } }); } private static void modify(Path p) { System.out.println(p.toString()); }
方法二:拆分流为匹配/不匹配两组
用Collectors.partitioningBy把流分成两个集合,分别处理PDF文件和非PDF文件,这种方式适合需要对两类文件做不同批量操作的场景:
import java.util.Map; import java.util.stream.Collectors; public static void run(String arg) { Path rootDir = Paths.get(arg); PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:**.pdf"); Map<Boolean, List<Path>> pathGroups = Files.walk(rootDir) .collect(Collectors.partitioningBy(matcher::matches)); // 处理PDF文件 pathGroups.get(true).forEach(Start::modify); // 处理非PDF文件(else逻辑) pathGroups.get(false).forEach(path -> { System.out.println("非PDF文件:" + path.toString()); }); } private static void modify(Path p) { System.out.println(p.toString()); }
简单来说,原来的filter相当于提前做了“只留符合条件的”筛选,所以后续没有else的空间。要处理else逻辑,就得把判断逻辑挪到能接触到所有元素的环节里,或者提前拆分流~
内容的提问来源于stack exchange,提问作者menteith
相关产品推荐
相关产品推荐

