在学习方法引用的时候,我发现方法引用其实与lambda表达式类似。在使用lambda表达式的时候,lambda带来的好处是,当我们仅仅希望调用那些已经存在函数名的方法,而没有任何多余动作时,lambda表达式使得调用过程的代码十分简洁。而方法引用是lambda表达式的另一种表现形式,所以,lambda表达式能使用的地方,方法引用也能使用.
方法类型 | 方法引用 | lambda表达式 |
---|---|---|
静态方法 | 类名::staticMethod | (参数)->类名.staticMethod(参数) |
实例方法 | 实例::instMethod | (参数)->实例.instMethod(参数) |
对象方法 | 类名::instMethod | (参数)->类名.instMethod |
构造方法 | 类名::new | (参数)->new 类名(参数) |
1、方法引用是什么
方法引用是用来直接访问类或者实例已经存在的方法或者构造方法。
2、方法引用举例
2.1、静态方法
创建一个food类,包含food的价格。之后要求将一组food实例按照价格排序
class food{
private Integer price;
food(int price){
this.price = price;
}
public int getPrice(){
return this.price.intValue();
}
public static int compare(food a,food b){
return a.price.compareTo(b.price);
}
}
测试
public static void main(String[] args){
food[] foodArr = {new food(1),new food(5),new food(3),new food(2),new food(4)};
Arrays.sort(foodArr,foodArr::compare); //此处引用了food类中的静态方法
//Arrays.sort(foodArr,(a,b)->food.compare(a,b))// //lambda表达式写法
for(food a:foodArr){
System.out.println(a.getPrice());
}
}
1
2
3
4
5
2.2、实例方法
实例方法在使用时与静态方法不同的是,需要先创建一个实例。
class food{
private Integer price;
private String name;
food(int price){
this.price = price;
}
food (String name){
this.name = name;
}
public int getPrice(){
return this.price.intValue();
}
public String getName(){
return this.name;
}
public static int compare(food a,food b){
return a.price.compareTo(b.price);
}
}
测试
public static void main(String[] args){
food Food = new food("鸡蛋");
//Supplier<String> supplier1 = ()->Food.getName();//
Supplier<String> supplier2 = Food::getName;
}
鸡蛋
2.3、对象方法
所谓对象方法就是指,在lambda表达式中,第一个参数是实例,第二个参数为第一个参数调用方法的参数。
public static void main(String[] args){
String[] strArr = {"a","c","e","d","b"};
//Arrays.sort(strArr,(a,b)->a.compareTo(b));//
Arrays.sort(strArr,strArr::compareTo);
}
2.4、构造方法
需要调用的构造器的参数列表要与函数式接口中抽象方法的参数列表保持一致。
在food类中有两个构造器,所以在使用构造方法引用时需要与这两种构造器的参数列表匹配
Function<String,food> function = food::new; //匹配的是food(String name)构造器
Function<Integer,food> function = food::new; //匹配的是food(int price)构造器