【Java】—— 函数式编程:Lambda表达式、方法引用
目录
一、什么是Lambda表达式?
二、Lambda表达式使用规则
1、参数类型可以全部省略
2、如果只有一个参数,参数类型省略的同时"()"也可以省略
3、如果方法体中只有一行代码,大括号{}可以省略,同时省略";",如果有return,也必须省略
三、方法引用
1、静态方法引用
2、实例方法引用
3、构造器引用
一、什么是Lambda表达式?
JDK 8开始新增的一种语法形式,可以替代匿名内部类对象,让程序更简洁。
注意:只能替代函数式接口(有且仅有一个抽象方法的接口)的匿名内部类!!
二、Lambda表达式使用规则
1、参数类型可以全部省略
A a1 = (m,n) -> {
return m+n;
};
2、如果只有一个参数,参数类型省略的同时"()"也可以省略
B b1 = c -> {
System.out.println("省略()");
} ;
3、如果方法体中只有一行代码,大括号{}可以省略,同时省略";",如果有return,也必须省略
A a2 = (m,n) -> m+n;
三、方法引用
使用已经存在的方法,作为函数式接口中抽象方法的方法体。
// 匿名内部类写法
calculateAndPrint(new Computer() {
@Override
public double pow(double x, double y) {
return Math.pow(x, y);
}
});
// lambda写法
calculateAndPrint((double a,double b) -> {return Math.pow(a,b);});
// lambda省略写法
calculateAndPrint((a,b)->Math.pow(a,b));
// 方法引用写法
calculateAndPrint(Math::pow);
方法引用有静态方法引用、实例方法引用、构造方法引用
1、静态方法引用
使用格式:
类名 :: 静态方法
使用场景:
某个Lambda表达式里只是调用一个静态方法,并且“→”前后参数的形式一致
// 匿名内部类写法
calculateAndPrint(new Computer() {
@Override
public double pow(double x, double y) {
return Math.pow(x, y);
}
});
// lambda省略写法
calculateAndPrint((a,b)->Math.pow(a,b));
// 方法引用写法
calculateAndPrint(Math::pow);
2、实例方法引用
1)使用格式:
对象名 :: 实例方法
使用场景:
某个Lambda表达式里只是通过对象名称调用一个实例方法,并且“→”前后参数的形式一致
// 使用匿名内部类
Arrays.sort(student, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getAge() - o2.getAge();
}
});
// 使用lambda表达式
Arrays.sort(student, (o1, o2) -> o1.getAge() - o2.getAge());
// 使用方法引用
Arrays.sort(student, new StudentComputer()::subAge);
2)使用格式:
类名 :: 实例方法
使用场景:
某个Lambda表达式里只是通过对象名称调用一个实例方法,同时参数列表中的第一个参数就是调用实例方法的对象, 并且“→”前后剩余参数的形式一致
// 匿名内部类
convertAndPrint(new Convert() {
@Override
public String convert(String source, String oldStr, String newStr) {
return source.replace(oldStr,newStr);
}
}, "四月天行健", "四", "五");
// lambda写法
convertAndPrint(((source, oldStr, newStr) -> source.replace(oldStr,newStr)),"北京","北","南");
// 方法引用
convertAndPrint(String::replace,"JavaEE","JavaEE","Harmony");
3、构造器引用
使用格式:
类名 :: new
使用场景:
某个Lambda表达式里只是在创建对象,并且“→”前后参数情况一致
// 匿名内部类
createStringAndPrint(new StringFactory() {
@Override
public String createString(byte[] bytes) {
return new String(bytes);
}
}, bys);
// lambda
createStringAndPrint(bytes -> new String(bytes),bys);
// 方法引用
createStringAndPrint(String::new,bys);