JavaSE——JDK8新特性(2/2):方法引用(静态方法的引用、实例方法的引用、特定类型的方法引用、构造器引用)

简介: JavaSE——JDK8新特性(2/2):方法引用(静态方法的引用、实例方法的引用、特定类型的方法引用、构造器引用)

JDK8新特性:方法引用——进一步简化Lambda表达式的

  • 方法引用的标志性符号“ :: ”

先来看静态方法的引用

静态方法的引用

  • 类名 :: 静态方法。

使用场景

  • 如果某个Lambda表达式里只是调用一个静态方法,并且前后参数的形式一致,就可以使用静态方法引用。

实例演示

原始写法


用Lambda简化之后


此时定义了一个类中的一个静态方法是实现排序规则的:


那么Lambda简化之后的式子就可以这么写:


静态方法引用就是在某个Lambda表达式里只是调用一个静态方法,并且前后参数的形式一致,就可以使用。

使用引用之后:

代码部分

public class Test {
    public static void main(String[] args){
        Student[] students = new Student[4];
        students[0] = new Student("蜘蛛精",169.5,24);
        students[1] = new Student("紫霞",163.8,25);
        students[2] = new Student("紫霞",163.8,25);
        students[3] = new Student("至尊宝",167.5,21);
 
        //原始写法:对数组中的学生对象,按照年龄升序排序
//        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)-> CompareByData.compareByAge(o1,o2) );
 
        Arrays.sort(students, CompareByData::compareByAge );
        
    }
}
 
class CompareByData{
    public static int compareByAge(Student o1,Student o2){
        return o1.getAge() - o2.getAge(); //升序排序
    }
}

实例方法的引用

  • 对象名 :: 实例方法

使用场景

  • 如果某个Lambda表达式里只是调用一个实例方法,并且前后参数的形式一致,就可以使用实例方法引用。

实例演示

先在一个类中定义一个实例方法:


然后到Test类中调用该方法,并经由Lambda表达式简化:


实例方法引用:

当某个Lambda表达式里只是调用一个实例方法,并且前后参数的形式一致,就可以使用实例方法引用。


代码部分

public class Test {
    public static void main(String[] args){
        Student[] students = new Student[4];
        students[0] = new Student("蜘蛛精",169.5,24);
        students[1] = new Student("紫霞",163.8,25);
        students[2] = new Student("紫霞",163.8,25);
        students[3] = new Student("至尊宝",167.5,21);
 
        CompareByData compare = new CompareByData();
//        Arrays.sort(students, new Comparator<Student>() {
//            @Override
//            public int compare(Student o1, Student o2) {
//                return o2.getAge() - o1.getAge();
//            }
//        });
 
//        Arrays.sort(students,(o1, o2) -> o2.getAge() - o1.getAge());
 
//        Arrays.sort(students,(o1, o2) -> compare.compareByAgeDesc(o1,o2));
 
        Arrays.sort(students,compare::compareByAgeDesc);
        
    }
}
 
class CompareByData{
    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(); //降序排序
    }
}

特定类型的方法引用

  • 类型 :: 方法

使用场景

  • 如果某个Lambda表达式里只是调用一个实例方法,并且前面参数列表中的第一个参数是作为方法的主调,后面的所有参数都是作为该实例方法的入参的,则此时就可以使用特定类型的方法引用。

实例演示

排序一个字符串数组(忽略字符串大小写)


运行结果:


这显然不是我们想要看到的排序效果,所以接下来就要自定义排序规则:

实际上,我们调用方法compareToIgnoreCase,它已经制定好了忽略首字母大小写的排序规则。


运行结果:


这时我们发现:这个Lambda表达式里只是调用一个实例方法,并且前面参数列表中的第一个参数是作为方法的主调,后面的所有参数都是作为该实例方法的入参的,则此时就可以使用特定类型的方法引用。


进行方法引用之后:


代码部分

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) {
//                //制定比较规则, o1 = "Andy" o2 = "angela"
//                return o1.compareToIgnoreCase(o2);
//            }
//        });
 
//        Arrays.sort(names, (o1, o2)->  o1.compareToIgnoreCase(o2));
 
        //特定类型方法引用
        Arrays.sort(names,String::compareToIgnoreCase);   //compareToIgnoreCase是String里面的方法
 
        System.out.println(Arrays.toString(names));
 
    }
}
class CompareByData{
    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(); //降序排序
    }
}

构造器引用

  • 类名 :: new

使用场景

  • 如果某个Lambda表达式里只是在创建对象,并且前后参数情况一致,就可以使用构造器引用。

语法演示

这里的例子并没有太多的实际意义,重点放在语法的示例

首先定义了一个CreateCar的接口和一个Car类:

然后在main方法里面创建这个接口的匿名内部类对象:



进行简化:


代码部分

public class Test {
    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); //Lambda表达式简化
 
        CreateCar cc = Car::new; //构造器引用
        Car c = cc.create("奔驰",49.9);
        System.out.println(c);
 
    }
}
 
interface CreateCar{
    Car create(String name,double price);
}
 
 
class Car {
    private String name;
    private double price;
 
    public Car() {
    }
 
    public Car(String name, double price) {
        this.name = name;
        this.price = price;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public double getPrice() {
        return price;
    }
 
    public void setPrice(double price) {
        this.price = price;
    }
}

END



目录
相关文章
|
1月前
|
容器
jdk8新特性-详情查看文档
jdk8新特性-详情查看文档
59 7
|
3月前
|
Java Go Scala
jdk10的var局部变量类型推理
本文介绍了JDK 10中引入的局部变量类型推断功能,即`var`关键字,它允许开发者在声明具有初始值的局部变量时省略显式类型,以简化代码并提高可读性。
24 1
jdk10的var局部变量类型推理
|
3月前
|
Java
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
本示例展示了Java中函数式接口的使用,包括自定义和内置的函数式接口。通过方法引用,实现对字符串操作如转换大写、数值转换等,并演示了Function、Consumer、Supplier及Predicate四种主要内置函数式接口的应用。
36 1
|
4月前
|
容器
jdk8新特性-详情查看文档
jdk8新特性-详情查看文档
56 3
|
3月前
|
存储 安全 Java
JDK1.8 新的特性
JDK1.8 新的特性
39 0
|
4月前
|
Oracle Java 关系型数据库
【颠覆性升级】JDK 22:超级构造器与区域锁,重塑Java编程的两大基石!
【9月更文挑战第6天】JDK 22的发布标志着Java编程语言在性能和灵活性方面迈出了重要的一步。超级构造器和区域锁这两大基石的引入,不仅简化了代码设计,提高了开发效率,还优化了垃圾收集器的性能,降低了应用延迟。这些改进不仅展示了Oracle在Java生态系统中的持续改进和创新精神,也为广大Java开发者提供了更多的可能性和便利。我们有理由相信,在未来的Java编程中,这些新特性将发挥越来越重要的作用,推动Java技术不断向前发展。
|
4月前
|
编解码 安全 Java
jdk8新特性-接口和日期处理
jdk8新特性-接口和日期处理
|
5月前
|
API
JDK8的stream有求和方法吗?
【8月更文挑战第20天】JDK8的stream有求和方法吗?
174 3
|
4月前
|
Java 编译器 API
JDK8新特性--lambda表达式
JDK8的Lambda表达式是Java语言的一大进步。它为Java程序提供了更多的编程方式,让代码更加简洁,也让函数式编程的概念在Java中得到了体现。Lambda表达式与Java 8的其他新特性,如Stream API、新的日期时间API一起,极大地提高了Java编程的效率和乐趣。随着时间的流逝,Java开发者对这些特性的理解和应用将会越来越深入,进一步推动Java语言和应用程序的发展。
24 0
|
4月前
|
Java
安装JDK18没有JRE环境的解决办法
安装JDK18没有JRE环境的解决办法
435 3