Lambda表达式使用的前提,就是接口必须是一个函数式接口。
定义
如果在接口中,只有一个抽象方法,那么这个接口就是函数式接口。
格式
使用注解来检查当前接口是否是一个函数式接口
@FunctionalInterface
如果不是函数式接口,则编译报错。
作用
主要用于函数式编程(即使用lambda表达式编程)。
@FunctionalInterface
interface Inter1{
// 有且只能有一个抽象方法
void test1();
// 其它方法,
}
Lambda表达式作用就是简化匿名内部类。
**语法格式1:**没有参数,也没有返回值
() -> System.out.println(“xxyy”); // 右边是方法体
**语法格式2:**有一个参数,没有返回值
(x) -> System.out.println(x * x);
说明:如果只有一个参数,那么小括号可以省略
**语法格式3:**有多个参数,没有返回值,格式和语法格式2相同
(x, y) -> System.out.println(x + y);
**语法格式4:**接口中需要重写的方法,方法内容有多句,需要给多句话加上大括号
(x, y) -> {int result = x + y; return result;}
示例代码
// 定义函数式接口,无参数无返回值
interface MyInter1{
void sayHello();
}
// 定义函数式接口,有一个参数,无返回值
interface MyInter2{
void introduce(String name);
}
// 定义函数式接口,有两个参数,无返回值
interface MyInter3{
void test3(int x,int y);
}
// 定义函数式接口,有参数,有返回值
interface MyInter4{
int add(int a,int b);
}
public class LambdaTest {
// 无参无返回值
@Test
public static void test1(){
//使用匿名内部类方式
MyInter1 i1 = new MyInter1(){
public void sayHello() {
System.out.println("hello");
}
};
i1.sayHello();
//使用Lambda表达式
MyInter1 i2 = ()->System.out.println("hello lambda");
i2.sayHello();
}
// 有一个参数,无返回值
@Test
public static void test2(){
// 匿名内部类方式
MyInter2 i1 = new MyInter2(){
public void introduce(String name) {
System.out.println("大家好,我是: "+name);
}
};
i1.introduce("张根硕");
//使用Lambda表达式,可以省略小括号
MyInter2 i2 = name-> System.out.println("Lambda:大家好,我是: "+name);
i2.introduce("张无忌");
}
// 无返回值,有多个参数
@Test
public static void test3(){
// 匿名内部类方式
MyInter3 i1 = new MyInter3(){
public void test3(int x, int y) {
System.out.println(x-y);
}
};
i1.test3(100,90);
// Lambda表达式方式,不能省略小括号
MyInter3 i2 = (a,b)->System.out.println(a-b);
i2.test3(200, 90);
}
// 有参数有返回值
@Test
public static void test4(){
// 匿名内部类方式
MyInter4 i1 = new MyInter4() {
public int add(int a, int b) {
int result = a+b;
return result;
}
};
System.out.println(i1.add(1,2));
//Lambda表达式方式
//MyInter4 i2 = (x,y)->{int result = x+y;return result;};
MyInter4 i2 = (x,y)->x+y;
System.out.println(i2.add(10, 20));
}
}
所谓的方法引用,就是在特殊的方法调用时有特殊的语法,相当于简化代码
格式
示例代码
@FunctionalInterface
public interface MyInter1 {
// 求两个数的和
int sum(int a, int b);
}
@FunctionalInterface
public interface MyInter2 {
// 返回一个对象
User user();
}
// 求两个和的工具类,非静态方法
public class MathUtil {
// 普通方法,求两个数的和,需要对象调用
public int sum1(int a, int b) {
return a + b;
}
// 静态方法,求两个数的和,类名直接调用
public static int sum2(int a, int b) {
return a + b;
}
}
// 测试代码
@Test
public void test1() {
// 静态方法引用
MyInter1 myInter1 =MathUtil::sum2;
int sum = myInter1.sum(1, 2);
System.out.println(sum);
}
@Test
public void test2() {
// 普通方法引用
MyInter1 myInter1 =new MathUtil()::sum1;
int sum = myInter1.sum(1, 2);
System.out.println(sum);
}
@Test
public void test3() {
// 构造方法引用
MyInter2 myInter2 = User::new;
User user = myInter2.user();
System.out.println(user);
}
完结,撒花! 感谢点赞 IT交流WX: c_-j_-c