java的lambda妙用举例

以下是 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 使用注意事项

  1. 变量捕获限制
    只能捕获 final 或等效 final 的局部变量 (示例:int count = 0; Runnable r = () -> count++; 会编译报错)。
  2. 方法引用简化
    当逻辑仅为调用现有方法时,优先用 对象::方法类::静态方法(如 list.forEach(System.out::println) )。
  3. 并行流谨慎使用
    数据量小时可能降低性能,需通过 parallelStream().sequential() 灵活切换
相关推荐
Rain的Java大神之路11 分钟前
线上接口负载满了如何解决
java·数据库·redis·后端·缓存·面试·架构
counting money29 分钟前
Tomcat 专题:从基础架构到性能调优与 WebSocket 实战
java·websocket·tomcat
xiaohaiAIgeo1 小时前
【2026年】HG/T 20656-2024化工暖通空调设计规范:新版标准的变化与影响
java·前端·javascript·科普知识
小强库计算机毕业设计1 小时前
基于 Spring Boot + Vue3 的校园管理系统
java·spring boot·后端·项目实战·管理系统·技术分享·校园管理系统实战
霸道流氓气质2 小时前
Java中信号量(Semaphore):从本地到分布式
java·开发语言·分布式
怪奇云呼军2 小时前
G.711、Opus 和重采样会拖慢识别吗?闪电智能VoiceAgent 的音频入口怎么选
java·人工智能·python·算法·云计算·音视频
编程令我快乐2 小时前
maven部分构建参数讲解
java·maven
ZC跨境爬虫2 小时前
LeetCode 27. 移除元素(双指针详解 + Java Python 多解法对比)
java·python·leetcode
kisbad3 小时前
Day 036|OpenAI Agents SDK 快速开始:今天跑通第一个 Agent
java·前端·javascript
憧憬成为java架构高手的小白3 小时前
langchain4j框架学习
java