Java Lambda 表达式
Lambda 表达式的本质是:把行为(代码)当作参数传递。它让 Java 具备了函数式编程的能力,配合 Stream API 使用,可以写出非常简洁、优雅的代码。
Lambda
Lambda 表达式是 Java 8 引入的核心特性,它允许你以简洁的方式编写匿名函数(没有名字的方法),是函数式编程的基础。
基本语法
(参数列表)->{方法体}| 部分 | 说明 |
|---|---|
(参数列表) | 可以省略类型,多个参数用逗号分隔 |
-> | 箭头操作符,分隔参数和方法体 |
{ 方法体 } | 单行可省略{}和return |
// 无参数()->System.out.println("Hello")// 一个参数(可省略括号)x->x*x// 多个参数(a,b)->a+b// 多行方法体(需要 {} 和 return)(x,y)->{intsum=x+y;returnsum*2;}前提:函数式接口
Lambda 表达式只能用于函数式接口——即只有一个抽象方法的接口(可以有多个 default/static 方法)。
@FunctionalInterfacepublicinterfaceRunnable{voidrun();// 只有一个抽象方法}@FunctionalInterfacepublicinterfaceFunction<T,R>{Rapply(Tt);// 只有一个抽象方法}常见使用场景
创建线程
// 传统写法newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println("Hello");}}).start();// Lambda 写法newThread(()->System.out.println("Hello")).start();Stream 流操作
List<String>names=users.stream().filter(user->user.getAge()>=18)// Predicate<User>.map(user->user.getName())// Function<User, String>.collect(Collectors.toList());集合遍历
// 传统写法for(Stringname:names){System.out.println(name);}// Lambda 写法names.forEach(name->System.out.println(name));// 更简洁:方法引用names.forEach(System.out::println);排序
List<String>list=Arrays.asList("b","c","a");// 传统写法Collections.sort(list,newComparator<String>(){@Overridepublicintcompare(Stringa,Stringb){returna.compareTo(b);}});// Lambda 写法Collections.sort(list,(a,b)->a.compareTo(b));// 更简洁list.sort(String::compareTo);Lambda 与匿名内部类的区别
| 对比项 | 匿名内部类 | Lambda 表达式 |
|---|---|---|
| 本质 | 创建一个新类的实例 | 不创建新类,直接指向方法实现 |
this指向 | 指向内部类自身 | 指向外部类实例 |
| 变量捕获 | 可以修改实例变量 | 只能引用有效 final 的局部变量 |
| 性能 | 生成额外的.class文件 | 更轻量(通过invokedynamic实现) |
