JavaSE核心知识点03高级特性03-04(Lambda表达式)

🤟致敬读者

  • 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉

📘博主相关



📃文章前言

  • 🔷文章均为学习工作中整理的笔记。
  • 🔶如有错误请指正,共同学习进步。

在这里插入图片描述

JavaSE核心知识点03高级特性03-04(Lambda表达式)

让我们一步步深入了解Java中的Lambda表达式。

一、Lambda表达式简介

Lambda表达式是Java 8引入的一种简洁的匿名函数写法,主要用于简化函数式接口(仅含一个抽象方法的接口)的实现。它使得代码更简洁、易读,尤其在处理集合和并发任务时效果显著。


二、Lambda表达式基础语法

Lambda的基本结构如下:

(参数列表) -> { 方法体 }
  • 参数列表:与接口方法参数一致,类型可省略。
  • 箭头符号->:分隔参数和方法体。
  • 方法体:单行代码可省略{}return,多行则必须使用。
示例对比:Lambda vs 匿名内部类

匿名内部类

Runnable r = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello World");
    }
};

Lambda表达式

Runnable r = () -> System.out.println("Hello World");

三、函数式接口(Functional Interface)

函数式接口是Lambda表达式的核心,Java内置了多种常用接口:

接口方法用途
Runnablevoid run()无参无返回值
Consumer<T>void accept(T)消费一个参数
Supplier<T>T get()提供返回值
Function<T,R>R apply(T)接收T类型,返回R类型
Predicate<T>boolean test(T)条件判断
自定义函数式接口:
@FunctionalInterface
interface Greeting {
    void sayHello(String name);
}

// 使用Lambda
Greeting greet = name -> System.out.println("Hello, " + name);
greet.sayHello("Alice"); // 输出:Hello, Alice

四、Lambda表达式使用场景

1. 替代匿名内部类

简化事件监听、线程创建等代码:

// 传统方式
new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("Running!");
    }
}).start();

// Lambda方式
new Thread(() -> System.out.println("Running!")).start();
2. 集合操作与Stream API

结合Stream处理集合,代码更简洁:

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

// 过滤并打印长度>3的名字
names.stream()
     .filter(name -> name.length() > 3)
     .forEach(System.out::println);
// 输出:Alice, Charlie
3. 作为方法参数

传递行为而非值:

public static void processList(List<Integer> list, Consumer<Integer> processor) {
    for (Integer num : list) {
        processor.accept(num);
    }
}

// 调用
processList(Arrays.asList(1, 2, 3), num -> System.out.println(num * 2));
// 输出:2, 4, 6

五、Lambda表达式进阶特性

1. 方法引用(Method Reference)

进一步简化Lambda,四种形式:

  • 静态方法类名::方法名
  • 实例方法对象::方法名
  • 任意对象的实例方法类名::方法名
  • 构造方法类名::new

示例:

// Lambda写法
Consumer<String> c1 = s -> System.out.println(s);
// 方法引用
Consumer<String> c2 = System.out::println;

List<String> names = Arrays.asList("Alice", "Bob");
names.forEach(System.out::println); // 输出每个元素
2. 变量作用域

Lambda可以访问final或等效final的局部变量:

int limit = 5; // 等效final
List<Integer> numbers = Arrays.asList(1, 2, 3, 6);
numbers.stream()
       .filter(n -> n < limit) // 正确:limit不可修改
       .forEach(System.out::println);
3. 类型推断

编译器根据上下文推断参数类型:

// 完整写法
Function<String, Integer> f1 = (String s) -> s.length();
// 简化写法(省略类型)
Function<String, Integer> f2 = s -> s.length();

六、注意事项

  1. 仅用于函数式接口:Lambda只能替代单一抽象方法的接口。
  2. 省略规则
    • 单参数可省略()s -> s.length()
    • 单行代码可省略{}return(a, b) -> a + b
  3. this关键字:Lambda中的this指向外部类,而非Lambda自身。

七、综合示例

场景:使用Lambda和Stream对用户列表进行排序和过滤。

List<User> users = Arrays.asList(
    new User("Alice", 25),
    new User("Bob", 30),
    new User("Charlie", 20)
);

// 按年龄排序,过滤年龄≥25,提取用户名
List<String> names = users.stream()
    .sorted((u1, u2) -> u1.getAge() - u2.getAge())
    .filter(u -> u.getAge() >= 25)
    .map(User::getName)
    .collect(Collectors.toList());

System.out.println(names); // 输出:[Alice, Bob]

通过以上内容,你应该能够掌握Lambda的基本用法和常见场景。建议多实践,尝试将现有的匿名类重构为Lambda,并熟悉Stream API的使用,以充分发挥Lambda的优势。



📜文末寄语

  • 🟠关注我,获取更多内容。
  • 🟡技术动态、实战教程、问题解决方案等内容持续更新中。
  • 🟢《全栈知识库》技术交流和分享社区,集结全栈各领域开发者,期待你的加入。
  • 🔵​加入开发者的《专属社群》,分享交流,技术之路不再孤独,一起变强。
  • 🟣点击下方名片获取更多内容🍭🍭🍭👇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值