Java Lambda表达式入门教程 1. 什么是Lambda表达式Java 8 引入的 Lambda 表达式本质上是一个可以传递的匿名函数。它允许我们将函数作为参数传递给方法或者将代码视为数据。Lambda 表达式极大地简化了函数式编程风格的代码编写尤其是在集合操作、事件处理和并发编程等场景下可以替代过去冗长的匿名内部类。2. 函数式接口在深入 Lambda 之前必须先理解函数式接口。函数式接口是只包含一个抽象方法的接口可以有多个默认方法或静态方法。Lambda 表达式只能用于实现函数式接口。例如我们定义两个接口// 无参数、无返回值的函数式接口interfaceDemo1{voidshow();}// 有参数、有返回值的函数式接口interfaceDemo2{intadd(inta,intb);}两个接口都只声明了一个抽象方法因此都是合法的函数式接口。Lambda 表达式就是这些抽象方法的实现。3. Lambda 表达式语法基本语法格式如下(parameters) - expression当方法体只有一条语句且直接作为返回值时可以省略大括号和return。(parameters) - { statements; }当方法体包含多条语句或需要显式书写return、抛出异常等时必须使用大括号。参数类型可以省略由编译器根据上下文推断如果只有一个参数且无类型还可以省略小括号。但为了清晰通常保留括号。4. 实战从匿名内部类到 Lambda下面我们从一个完整的示例出发逐步展示如何用 Lambda 表达式替代匿名内部类并理解其运行过程。4.1 传统匿名内部类写法对比publicclassTraditionalDemo{publicstaticvoidrun1(Demo1d){d.show();}publicstaticvoidrun2(Demo2d){System.out.println(d.add(1,2));}publicstaticvoidmain(String[]args){// 匿名内部类实现 Demo1run1(newDemo1(){Overridepublicvoidshow(){System.out.println(Hello Java);}});// 匿名内部类实现 Demo2run2(newDemo2(){Overridepublicintadd(inta,intb){returnab;}});}}4.2 Lambda 表达式重构使用 Lambda 表达式后代码大幅精简// 函数式接口定义interfaceDemo1{voidshow();}interfaceDemo2{intadd(inta,intb);}publicclassLambdaDemo{publicstaticvoidrun1(Demo1d){d.show();// 调用对象的方法}publicstaticvoidrun2(Demo2d){System.out.println(d.add(1,2));}publicstaticvoidmain(String[]ages){// 1. 无参无返回值的 Lambdarun1(()-System.out.println(Hello Java));// 2. 有参数有返回值的 Lambda单条语句省略 return 和大括号run2((a,b)-ab);// 3. 多行语句的 Lambda必须使用大括号run1(()-{System.out.println(Hello);System.out.println(World);});}}运行结果Hello Java 3 Hello World4.3 代码解读() - System.out.println(Hello Java)对应Demo1接口的void show()方法。小括号为空表示无参箭头后面是只有一条语句的方法体。(a, b) - a b对应Demo2接口的int add(int a, int b)。参数类型被自动推断为int表达式a b的值自动作为返回值无需return关键字。当方法体超过一条语句时必须用大括号包裹每条语句末尾加分号这与普通方法体写法一致。Lambda 在这里只是让代码更紧凑但并未改变 Java 基本的代码块规则。5. 常用函数式接口与进阶Java 8 在java.util.function包中提供了一系列标准函数式接口避免大家重复造轮子。常用四个接口抽象方法说明PredicateTboolean test(T t)断言型判断输入是否满足某条件ConsumerTvoid accept(T t)消费型对输入执行某种操作不返回结果FunctionT,RR apply(T t)函数型接收 T返回 RSupplierTT get()供给型无参但返回一个结果示例importjava.util.function.*;publicclassFunctionalInterfaceDemo{publicstaticvoidmain(String[]args){// Predicate: 判断是否大于5PredicateIntegerisGreaterThan5x-x5;System.out.println(isGreaterThan5.test(10));// true// Consumer: 打印字符串ConsumerStringprinters-System.out.println(输出s);printer.accept(Hello Lambda);// Function: 求字符串长度FunctionString,IntegerlengthFuncstr-str.length();System.out.println(lengthFunc.apply(Hello));// Supplier: 生成随机数SupplierDoublerandomSupplier()-Math.random();System.out.println(randomSupplier.get());}}方法引用简介当 Lambda 体只是调用一个已经存在的方法时可以进一步简化为方法引用格式为类名::方法名或对象::方法名。// Lambda 写法ConsumerStringprinter1s-System.out.println(s);// 方法引用ConsumerStringprinter2System.out::println;方法引用使代码更加简洁易读是 Lambda 的一种重要补充形式。Lambda 表达式以函数式接口为基石通过简洁的语法和丰富的标准接口打开了 Java 函数式编程的大门。语法优化常见范式实现基础核心概念Lambda 表达式匿名函数可传递的代码块函数式接口单一抽象方法FunctionalInterfacePredicate 断言型Consumer 消费型Function 函数型Supplier 供给型方法引用::6. 总结Lambda 表达式是 Java 8 中实现函数式接口的精简方式本质是匿名函数。函数式接口有且只有一个抽象方法是 Lambda 的载体。语法由参数列表、箭头、方法体组成单条语句可省大括号和return。Java 标准库提供了Predicate、Consumer、Function、Supplier等丰富的函数式接口极大方便了流式操作与函数式编程。方法引用是 Lambda 的语法糖当 Lambda 仅仅是调用一个已有方法时推荐使用。掌握 Lambda 表达式将帮助你写出更简洁、优雅的 Java 代码并为学习 Stream API、并行流等高级特性打下坚实基础。