JDK8新特性:方法引用
2024-01-08 05:03:31
静态方法引用
- 类名 ::静态方法。
使用场景
- 如果某个Lambda表达式里只是调用一个静态方法,并且前后参数的形式一致,就可以使用静态方法引用。
CompareByDate类
public class CompareByDate {
public static int compareByAge(Student o1,Student o2){
return o1.getAge() - o2.getAge();
}
}
Test类
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
Student[] students = new Student[4];
students[0] = new Student("张三",175.6,23);
students[1] = new Student("李四",169,20);
students[2] = new Student("王五",180.3,18);
students[3] = new Student("赵六",165.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(students);
}
}
实例方法的引用
- 对象名 ::实例方法。
使用场景
- 如果某个Lambda表达式里值是调用一个实例方法,并且前后参数的形式一致,就可以使用实例方法引用。
CompareByDate类
public class CompareByDate {
public int compareByAgeDesc(Student o1,Student o2){
return o1.getAge() - o2.getAge();
}
}
Test类
-
import java.util.Arrays; public class Test { public static void main(String[] args) { Student[] students = new Student[4]; students[0] = new Student("张三",175.6,23); students[1] = new Student("李四",169,20); students[2] = new Student("王五",180.3,18); students[3] = new Student("赵六",165.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)); //实例方法引用 CompareByDate compare = new CompareByDate(); //Arrays.sort(students,((o1, o2) -> compare.compareByAgeDesc(o1,o2))); Arrays.sort(students,compare::compareByAgeDesc); // 降序 System.out.println(students); } }
特定类型的方法引用
- 类型 ::方法
使用场景
- 如果某个Lambda表达式里只是调用一个实例方法,并且前面参数列表中的第一个参数是作为方法的主调,后面的所有参数都是作为该案例方法的入参的,则此时就可以使用特定类型的方法引用。
import java.util.Arrays;
import java.util.Comparator;
public class Test {
public static void main(String[] args) {
String[] names = {"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) {
// // 制定比较规则
// return o1.compareToIgnoreCase(o2);
// }
// });
//Arrays.sort(names, ( o1, o2) -> o1.compareToIgnoreCase(o2));
Arrays.sort(names, String::compareToIgnoreCase);
System.out.println(Arrays.toString(names));
}
}
构造器引用
- 类名 :: new
使用场景
- 如果某个Lambda表达式里只是在创建对象,并且前后参数情况一致,就可以使用构造器引用
Student类
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Test类
public class Test {
public static void main(String[] args) {
// addStudent ss = new addStudent(){
// @Override
// public Student addstudent(String name, int age) {
// return new Student(name,age);
// }
// };
//addStudent ss = ( name, age) -> new Student(name,age);
//构造器引用
addStudent ss = Student::new;
Student s = ss.addstudent("张三",18);
System.out.println(s);
}
}
interface addStudent{
Student addstudent(String name,int age);
}
文章来源:https://blog.csdn.net/SU_mu147/article/details/135362021
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!