You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:09:57