Java Lambda表达式

本文详细解析了Java中的Lambda表达式和函数式接口的概念。Lambda表达式是一种简化匿名内部类的语法糖,只能用于实现函数式接口,其语法简洁且直观。函数式接口是指仅包含一个抽象方法的接口,Java8引入了@FunctionalInterface注解来标记此类接口。文章通过具体示例展示了Lambda表达式的使用方法,以及如何将其作为参数传递给方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

函数式接口:

只包含一个抽象方法的接口。函数式接口可以包含多个默认方法、类方法,但只能包括一个抽象方法。

Java8提供了@FunctionalInterface注解,该注解放在接口定义前面,表示该接口是函数式接口,编译时会检查该接口是否符合函数式接口的要求。

 

Lambda表达式可以实现函数式接口,并在实现处创建一个对象,和匿名内部类相似。

区别:匿名内部类可以实现任何接口、抽象类,但Lambda表达式只能实现函数式接口。Lambda表达式相当于一种特殊的匿名内部类,但Lambda表达式比匿名内部类更加简洁。

 

Lambda表达式只是语法糖,编译时会被替换为常规的代码。

 

 

Lambda表达式语法:

(形参表) -> {

  .......//抽象方法的实现部分

}

无形参时,写为();只有一个形参时,可以缺省()。

代码块中只有一条语句时,可以缺省{};代码块中只有一条return语句时,可以缺省{}和return关键字(要缺省,必须同时缺省return关键字和{})。

参数表只写形参变量名,不写形参类型。

 

 

示例:

 1 package test;
 2 
 3 interface  Interface1{
 4     //无形参、无返回值
 5     void print();
 6 }
 7 
 8 interface Interface2{
 9     //有形参
10     void print(String str);
11 }
12 
13 interface Interface3 {
14     //有返回值
15     String getString();
16 }
17 
18 public class Test {
19     public static void main(String[] args) {
20         Interface1 interface1=()->{
21             System.out.println("接口1 ok");
22         };
23         interface1.print();
24 
25         //只有一个形参时,可以缺省();代码块只有一条语句时,可以缺省{}
26         Interface2 interface2=str-> System.out.println(str);
27         interface2.print("接口2 ok");
28 
29         //方法体中只有一条return语句时,可以同时缺省{}和return关键字,要缺省就必须同时缺省这两部分
30         Interface3 interface3=()-> "接口3 ok";
31         String str=interface3.getString();
32         System.out.println(str);
33     }
34 }

 

Lambda表达式会在该处创建一个该接口的示例,并返回这个实例,即Lambda表达式的值是对应接口的实例。

 

可以将Lambda表达式作为实参传递给方法:

 1 package test;
 2 
 3 interface Interface3 {
 4     //有返回值
 5     String getString();
 6 }
 7 
 8 public class Test {
 9     public static void main(String[] args) {
10         //可以将Lambda表达式作为实参传递给方法。Lambda表达式的值是对应接口的实例,并不是所实现抽象方法的返回值String。Lambda表达式比匿名内部类更简洁。
11         printStr(()->"ok");
12     }
13 
14     public static void printStr(Interface3 interface3){
15         System.out.println(interface3.getString());
16     }
17 }

 

 

Java中的很多接口都是函数式接口,比如ActionListener接口、Runnable接口。

 

Lambda表达式可访问的变量和匿名内部类可访问的变量完全一致,但Lambda表达式不能调用接口中定义的默认方法,匿名内部类则可以。

 

转载于:https://www.cnblogs.com/chy18883701161/p/10852628.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值