Lambda表达式简介

Lambda表达式是Java 8引入的一种匿名函数,用于简化函数式接口的实现。它允许将函数作为方法参数传递,或用于简化匿名内部类的写法。

Lambda语法结构

基本语法格式如下:

(parameters) -> expression

(parameters) -> { statements; }

Lambda表达式特点

  • 可选类型声明:参数类型可以省略,编译器能自动推断
  • 可选圆括号:单参数时可省略括号
  • 可选大括号:单行语句时可省略
  • 可选return关键字:单行表达式时会自动返回

常见使用场景

1. 替代匿名内部类

传统写法:

new Thread(new Runnable() {
    @Override
    public 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>() {
    @Override
    public 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表达式的简写形式,使用::符号表示。

四种形式:

  1. 静态方法引用:ClassName::staticMethod
  2. 实例方法引用:instance::method
  3. 特定类型的任意对象方法引用:ClassName::method
  4. 构造方法引用: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带来了函数式编程能力,合理使用可以显著提升代码简洁性和表达力,但也需要注意适度使用以避免代码可读性下降。

更多推荐