Lambda–方法引用、构造器引用、数组引用
文章目录
一.方法引用
Lambda已经极大地简化代码,方法引用是Lambda的另一种表现形式。Lambda方法体如果以及被实现了,我们可以直接去引用这个方法,不需要重复去写。
1.使用限制
方法引用引用的方法的参数列表和返回值类型,必须和函数式接口中抽象方法的参数列表和返回值类型保持一致。
2.语法格式
2.1 实例对象::实例方法名
Lambda写法:
Function<Integer,Integer> con = e -> e*e;
System.out.println(con.apply(10));
实例对象::实例方法名写法:
假如一个类中对方法体实现了,那么就可以直接通过该类的实例对象去引用
class math{
public int mult( int e){
return e*e;
}
}
public static void main(String[] args){
math m=new math();
Function<Integer,Integer> con1 = m::mult;
System.out.println(con1.apply(10));
}
2.2 类名::静态方法名
加入类中的方法是静态的,那么引用的时候可以直接通过类名去调用
class math{
public static int mult( int e){
return e*e;
}
}
public static void main(String[] args){
Function<Integer,Integer> con1 = math::mult;
System.out.println(con1.apply(10));
}
2.3 类名::实例方法名(特殊限制)
若Lambda 的参数列表的第一个参数,是实例方法的调用者,第二个参数(或无参)是实例方法的参数时,格式: ClassName::MethodName,如下所示:
// 测试两个字符串是否相等
public static void main(String[] args) {
// 传统的Lambda表达式
BiPredicate<String, String> bp = (x, y) -> x.equals(y);
System.out.println(bp.test("abc", "ab"));
System.out.println("-----------------");
// 使用方法引用
BiPredicate<String, String> bp1 = String::equals;
System.out.println(bp1.test("abc", "ab"));
}
再看一个例子
class math{
public List getList(){
return new ArrayList();
}
}
public static void main(String[] args){
math m=new math();
Function<math,List> con1 = math::getList;
}
二.构造器引用
当函数式接口中的抽象方法和构造器中参数列表一致时就可以使用构造器引用。
class math{
public int num;
public math(int num) {
this.num = num;
}
public math() {
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
public class LamdaDemo03 {
public static void main(String[] args){
//无参构造器,供给型接口
Supplier<math> sup=()-> new math();
Supplier<math> sup1=math::new;
//有参构造器,函数型接口
Function<Integer,math> sup2=(x)-> new math(x);
Function<Integer,math> sup3=math::new;
}
}
三.数组引用
数组引用的使用基本和构造器引用相同
// 生成指定长度的字符串数组
public static void main(String[] args) {
// 传统的Lambda表达式
Function<Integer, String[]> fun = (e) -> new String[e];
String[] str = fun.apply(5);
System.out.println(str.length);
System.out.println("---------------------------");
// 使用方法引用
Function<Integer, String[]> fun1 = String[]::new;
String[] str1 = fun1.apply(7);
System.out.println(str1.length);
}