以下是 Java Lambda 表达式的 7 个进阶应用场景及示例,结合历史对话未覆盖的典型用法和搜索结果的补充信息整理而成:
一、替代 Runnable 实现多线程
传统匿名内部类:
java
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(" 传统方式");
}
}).start();
Lambda 简化:
java
new Thread(() -> System.out.println("Lambda 线程启动")).start();
优势:代码量减少 60%,直接聚焦核心逻辑。
二、配合 Optional 安全处理空值
java
Optional.ofNullable(user.getName())
.filter(name -> name.length() > 3) // 过滤短用户名
.map(String::toUpperCase) // 转换为大写
.ifPresentOrElse(
name -> System.out.println(" 有效用户名: " + name),
() -> System.out.println(" 用户名为空")
);
作用 :避免 NullPointerException,链式操作更安全。
三、实现自定义策略模式
java
// 定义策略接口
interface PaymentStrategy {
void pay(double amount);
}
// Lambda 实现不同支付策略
PaymentStrategy creditCard = (amount) ->
System.out.println(" 信用卡支付: " + amount);
PaymentStrategy paypal = (amount) ->
System.out.println("PayPal 支付: " + amount);
// 调用示例
creditCard.pay(100.0); // 输出:信用卡支付: 100.0
价值:无需创建多个实现类,动态替换行为。
四、CompletableFuture 异步回调
java
CompletableFuture.supplyAsync(() -> {
// 模拟耗时操作
return "异步结果";
})
.thenApplyAsync(result -> result + "处理后")
.thenAccept(finalResult ->
System.out.println(" 最终结果: " + finalResult)
);
场景:非阻塞式处理耗时任务(如网络请求、IO操作)。
五、文件操作与流处理
java
Files.list(Paths.get("/data"))
.filter(path -> path.toString().endsWith(".txt")) // 过滤文本文件
.map(path -> {
try { return Files.readString(path); }
catch (IOException e) { return ""; }
})
.forEach(content -> System.out.println(" 内容: " + content.substring(0, 20)));
亮点:结合 NIO 实现声明式文件处理。
六、动态条件过滤(Predicate 组合)
java
Predicate<String> isLong = s -> s.length() > 5;
Predicate<String> containsA = s -> s.contains("A");
List<String> words = Arrays.asList("Apple", "Banana", "Pear");
List<String> filtered = words.stream()
.filter(isLong.and(containsA))
.collect(Collectors.toList()); // 输出: [Banana]
技巧 :通过 and/or 组合多个条件,提升复用性。
七、定时任务调度(结合 ScheduledExecutorService)
java
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(
() -> System.out.println(" 定时执行: " + LocalTime.now()),
0, 1, TimeUnit.SECONDS // 立即开始,每秒执行
);
应用 :替代 TimerTask,更灵活的周期任务控制。
附:Lambda 使用注意事项
- 变量捕获限制 :
只能捕获final或等效final的局部变量 (示例:int count = 0; Runnable r = () -> count++;会编译报错)。 - 方法引用简化 :
当逻辑仅为调用现有方法时,优先用对象::方法或类::静态方法(如list.forEach(System.out::println))。 - 并行流谨慎使用 :
数据量小时可能降低性能,需通过parallelStream().sequential()灵活切换