
一文搞懂Java8 Lambda表达式(附视频教程)
参数类型可选:可以省略明确写出参数类型。 单个参数可选括号:如果函数只接收一个参数,括号可以省略。 方法体可选大括号:如果方法体只有一条语句,直接写出语句即可,无需使用大括号。 简化返回语句:如果方法体的唯一语句是return语句,可以省略大括号和return关键字。 只有一个抽象方法。 可以包含静态方法和默认方法。
发布日期:2021-05-07 15:31:36
浏览次数:27
分类:精选文章
本文共 3060 字,大约阅读时间需要 10 分钟。
Lambda表达式介绍
Java 8引入了Lambda表达式,这种新特性极大地简化了代码编写,使程序更加简洁高效。Lambda表达式本质上是一个匿名函数,可以替代传统的匿名内部类,用于实现接口中的抽象方法。
体验Lambda表达式
让我们通过一个简单的例子来感受Lambda表达式的魅力。
传统实现
public class Program { public static void main(String[] args) { Cal c1 = new Cal() { @Override public int add(int a, int b) { return a + b; } }; int c = c1.add(1, 2); System.out.println(c); }}interface Cal { int add(int a, int b);}
Lambda实现
public class Program { public static void main(String[] args) { Cal c1 = (int a, int b) -> { return a + b; }; int c = c1.add(1, 2); System.out.println(c); } int add(int a, int b) { return a + b; }}interface Cal { int add(int a, int b);}
简化实现
public class Program { public static void main(String[] args) { Cal c1 = (int a, int b) -> a + b; int c = c1.add(1, 2); System.out.println(c); }}interface Cal { int add(int a, int b);}
通过上述对比可以看出,Lambda表达式的简洁性和强大之处。
Lambda表达式语法
Lambda表达式的基本语法结构为:
(参数列表) -> { 方法体 }
- 参数列表:用来描述函数接收的输入参数。
- 方法体:用来描述函数的逻辑实现。
- Lambda运算符 (->):连接参数列表和方法体,表示函数的定义方式。
语法细节
Lambda表达式实例
以下是实现不同接口的Lambda表达式:
无参数无返回值
If1 if1 = () -> System.out.println("无参数无返回值");if1.test();
单个参数无返回值
If2 if2 = a -> System.out.println("单个参数无返回值 a=" + a);if2.test(3);
两个参数无返回值
If3 if3 = (a, b) -> System.out.println("两个参数无返回值 a+b=" + (a + b));if3.test(2, 3);
无参数有返回值
If4 if4 = () -> 100;System.out.println(if4.test());
单个参数有返回值
If5 if5 = a -> { System.out.print("单个参数有返回值 "); return a;};System.out.println(if5.test(200));
多个参数有返回值
If6 if6 = (a, b) -> a + b;System.out.println(if6.test(1, 2));
方法引用
在多个Lambda表达式实现同一接口时,可以封装成方法引用,提升代码可维护性。
静态方法引用
Program2 program2 = new Program2();If5 if5 = program2::test;If5 if52 = Program2::test2;System.out.println(if5.test(1));System.out.println(if52.test(1));
构造方法引用
如果接口的实现恰好可以通过构造函数实现,可以使用构造方法引用。
Dog dog = new Dog();DogService dogService = Dog::new;DogService2 dogService2 = Dog::new;dogService.getDog();dogService2.getDog("小米", 11);
@FunctionalInterface注解
@FunctionalInterface注解用于标识函数式接口(SAM接口)。函数式接口必须具备以下特点:
示例
@FunctionalInterfacepublic interface TestInterface { void sub(); default void defaultMethod() {} static void staticMethod() {}}
错误示例
@FunctionalInterfacepublic interface TestInterface2 { void add(); void sub();}
系统内置函数式接口
Java 8提供了多个内置函数式接口,主要集中在java.util.function
包中。常用接口包括:
- Consumer
:用于消费操作,如遍历集合。 - Comparator
:用于比较操作。 - Predicate
:用于过滤操作。 - Supplier
:用于提供结果。
集合排序与遍历
Listlist = new ArrayList<>();list.add(new Dog("aa", 1));list.add(new Dog("bb", 4));list.add(new Dog("cc", 3));list.add(new Dog("dd", 2));list.add(new Dog("ee", 5));list.sort((o1, o2) -> o1.getAge() - o2.getAge());System.out.println(list);list.forEach(System.out::println);
结语
通过以上内容,可以看到Lambda表达式在Java中具有极大的灵活性和简洁性。它不仅简化了代码编写,还提升了代码的可读性和可维护性。建议通过实践项目来深入掌握Lambda表达式的使用,熟练掌握后,可以显著提升Java编程效率。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年03月28日 00时51分30秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
一个使用Java语言描述的矩阵旋转的例子
2019-03-04
两款用于检测内存泄漏的软件
2019-03-04
王爽 《汇编语言》 读书笔记 三 寄存器(内存访问)
2019-03-04
IDEA/eclipse集成阿里巴巴Java开发规约插件
2019-03-04
IDEA 热部署太热情不好(失去焦点就热部署)
2019-03-04
IDEA2020-2配置git,并从远程仓库获取代码分支
2019-03-04
IDEA快速恢复开发:导出配置和导入配置操作
2019-03-04
Java Socket网络编程-总结
2019-03-04
Linux通过yum仓库安装gcc详细教程
2019-03-04
加油站(贪心)
2019-03-04
最长的连续元素序列长度(哈希表)
2019-03-04
访问docker中的nginx容器部署
2019-03-04
LNMP环境搭建
2019-03-04
设计一个验证系统
2019-03-05
ubuntu 安装 vncserver
2019-03-05
centos7防火墙导致nginx无法访问
2019-03-05