目录
1 简述说明
作用:进一步简化Lambda表达式的
方法引用的标志性符合“::”
2 静态方法的引用
如果某个Lambda表达式里只是调用一个静态方法,并且前后参数的形式一致,就可以使用静态方法引用。
3 静态方法引用示例代码
一、创建学生类Student类
public class Student {
private String name;
private double height;
private int age;
public Student() {
}
public Student(String name, double height, int age) {
this.name = name;
this.height = height;
this.age = age;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return height
*/
public double getHeight() {
return height;
}
/**
* 设置
* @param height
*/
public void setHeight(double height) {
this.height = height;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Student{name = " + name + ", height = " + height + ", age = " + age + "}";
}
}
二、创建测试类
import java.util.Arrays;
import java.util.Comparator;
public class Test1 {
public static void main(String[] args) {
Student[] students = new Student[4];
students[0] = new Student("蜘蛛精", 177.3, 22);
students[1] = new Student("紫霞", 167.3, 27);
students[2] = new Student("紫霞", 163.3, 23);
students[3] = new Student("至尊宝", 178.9, 25);
// 原始写法:对数组中的学生对象,按照年龄升序排序
Arrays.sort(students, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getAge() - o2.getAge();//按照年龄升序排序
}
});
//使用Lambda简化后的形式
//Arrays.sort(students,(o1,o2) -> o1.getAge() - o2.getAge());
//Arrays.sort(students,(o1,o2) -> CompareByDate.compareByAge(o1,o2))
//静态方法引用
Arrays.sort(students,CompareByDate::compareByAge);
System.out.println(Arrays.toString(students));
}
}
三、创建CompareByDate类
public class CompareByDate {
public static int compareByAge(Student o1 ,Student o2){
return o1.getAge() - o2.getAge();// 升序排序的规则
}
}
4 实例方法的引用
格式
对象名::实例方法
使用场景:如果某个Lambda表达式只是调用一个实例方法,并且前后参数的形式一致,就可以使用实例方法引用。
5 实例方法引用的示例代码
public class CompareByDate {
/* public static int compareByAge(Student o1 ,Student o2){
return o1.getAge() - o2.getAge();// 升序排序的规则
}*/
public int compareByAgeDesc(Student o1 ,Student o2){
return o2.getAge() - o1.getAge();// 降序排序的规则
}
}
public class Test1 {
public static void main(String[] args) {
Student[] students = new Student[4];
students[0] = new Student("蜘蛛精", 177.3, 22);
students[1] = new Student("紫霞", 167.3, 27);
students[2] = new Student("紫霞", 163.3, 23);
students[3] = new Student("至尊宝", 178.9, 25);
// 原始写法:对数组中的学生对象,按照年龄升序排序
/* Arrays.sort(students, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getAge() - o2.getAge();//按照年龄升序排序
}
});
//使用Lambda简化后的形式
//Arrays.sort(students,(o1,o2) -> o1.getAge() - o2.getAge());
//Arrays.sort(students,(o1,o2) -> CompareByDate.compareByAge(o1,o2))
//静态方法引用
Arrays.sort(students,CompareByDate::compareByAge);
Arrays.sort(students,(o1,o2) -> o2.getAge() - o1.getAge());//降序*/
CompareByDate compare = new CompareByDate();
//Arrays.sort(students,(o1,o2) -> compare.compareByAgeDesc(o1,o2));//降序
Arrays.sort(students,(o1,o2) -> compare.compareByAgeDesc(o1,o2));//降序
//实例方法引用
Arrays.sort(students,compare::compareByAgeDesc);
System.out.println(Arrays.toString(students));
}
6 特定类型的方法引用
格式
类型::方法
使用场景:如果某个Lambda表达式里只是调用一个实例方法,并且前面参数列表中的第一个参数是作为方法的主调,后面的所有参数都是作为该实例方法的入参的,则此时就可以使用特定类型的方法引用。
7 特定类型的方法引用示例代码
import java.util.Arrays;
import java.util.Comparator;
/*掌握特定类型的方法引用*/
public class Test2 {
public static void main(String[] args) {
String [] names = {"Tom", "Jerry", "Mike","boby","angela","Andy",
"dlei","caocao","Babo","jack","Cici"};
//对数组进行排序(默认是按照字符串的首字符编号进行升序排序的)
//Arrays.sort(names);
//忽略首字符大小写进行排序
/* Arrays.sort(names, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// 制定比较规则。 o1 ="Andy" o2 ="angela"
return o1.compareToIgnoreCase(o2);
}
});*/
//Arrays.sort(names,( o1, o2) -> o1.compareToIgnoreCase(o2));
//特定类型的方法应用
Arrays.sort(names,String::compareToIgnoreCase);
System.out.println(Arrays.toString(names));
}
}
8 构造器引用
格式
类名::new
使用场景
如果某个Lambda表达式里只是在创建对象,并且后参数情况一致,就可以使用构造器引用。
9 构造器引用的示例代码
一、创建Car类
public class Car {
private String name;
private double price;
public Car() {
}
public Car(String name, double price) {
this.name = name;
this.price = price;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return price
*/
public double getPrice() {
return price;
}
/**
* 设置
* @param price
*/
public void setPrice(double price) {
this.price = price;
}
public String toString() {
return "Car{name = " + name + ", price = " + price + "}";
}
}
二、创建测试类
/*目标:构造器引用(理解语法)*/
public class Test3 {
public static void main(String[] args) {
//1、创建这个接口的匿名内部类对象
/* CreateCar cc = new CreateCar() {
@Override
public Car create(String name, double price) {
return new Car(name, price);
}
};*/
/* CreateCar cc = (name, price) -> new Car(name, price);*/
//构造器引用
CreateCar cc = Car::new;
Car c = cc.create("BMW", 400000);
System.out.println(c);
}
}
interface CreateCar {
Car create(String name, double price);
}
以上就是方法引用的内容。