Java之lambda表达式
Lambda表达式简介
Lambda表达式是Java 8引入的一种匿名函数,用于简化函数式接口的实现。它允许将函数作为方法参数传递,或用于简化匿名内部类的写法。
Lambda语法结构
基本语法格式如下:
(parameters) -> expression
或
(parameters) -> { statements; }
Lambda表达式特点
- 可选类型声明:参数类型可以省略,编译器能自动推断
- 可选圆括号:单参数时可省略括号
- 可选大括号:单行语句时可省略
- 可选return关键字:单行表达式时会自动返回
常见使用场景
1. 替代匿名内部类
传统写法:
new Thread(new Runnable() {@Overridepublic void run() {System.out.println("传统写法");}
}).start();
Lambda写法:
new Thread(() -> System.out.println("Lambda写法")).start();
2. 集合遍历
传统写法:
List<String> list = Arrays.asList("a", "b", "c");
for (String s : list) {System.out.println(s);
}
Lambda写法:
list.forEach(s -> System.out.println(s));
3. 排序操作
传统写法:
Collections.sort(list, new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return o1.compareTo(o2);}
});
Lambda写法:
Collections.sort(list, (o1, o2) -> o1.compareTo(o2));
函数式接口
Lambda表达式需要与函数式接口配合使用。函数式接口是指仅包含一个抽象方法的接口,常用注解@FunctionalInterface标识。
Java内置的常用函数式接口:
- Predicate<T>:接受一个参数返回boolean
- Function<T,R>:接受一个参数返回一个结果
- Consumer<T>:接受一个参数不返回结果
- Supplier<T>:不接受参数返回一个结果
方法引用
Lambda表达式的简写形式,使用::符号表示。
四种形式:
- 静态方法引用:ClassName::staticMethod
- 实例方法引用:instance::method
- 特定类型的任意对象方法引用:ClassName::method
- 构造方法引用:ClassName::new
示例:
list.forEach(System.out::println);
变量作用域
Lambda表达式可以访问:
- 类成员变量和静态变量
- 局部final变量或事实上的final变量
不能访问非final的局部变量,否则会编译错误。
优缺点分析
优点:
- 简化代码,提高可读性
- 支持函数式编程风格
- 便于并行操作集合
缺点:
- 调试相对困难
- 性能在特定场景下可能不如传统写法
- 过度使用可能降低代码可读性
实际应用示例
过滤集合
List<String> filtered = list.stream().filter(s -> s.startsWith("a")).collect(Collectors.toList());
映射转换
List<Integer> lengths = list.stream().map(s -> s.length()).collect(Collectors.toList());
排序组合
list.sort((s1, s2) -> {if (s1.length() != s2.length()) {return s1.length() - s2.length();}return s1.compareTo(s2);
});
Lambda表达式为Java带来了函数式编程能力,合理使用可以显著提升代码简洁性和表达力,但也需要注意适度使用以避免代码可读性下降。
