Java方法引用

本文深入探讨Java 8中的方法引用特性,介绍其概念、使用场景及分类,包括静态方法引用、实例方法引用、类型的实例方法引用、构造方法引用和数组构造方法引用,通过具体代码示例展示如何优化Lambda表达式。

1、什么是方法引用


方法引用是一种简写lambda表达式的方式。等同于lambda表达式

如:

List<String> stringsArray = Arrays.asList("sdf","gsdf","gsdf");
Collections.sort(stringsArray, (a,b)-> a.compareToIgnoreCase(b));

可简写为:

List<String> stringsArray = Arrays.asList("sdf","gsdf","gsdf");
Collections.sort(stringsArray, String::compareToIgnoreCase);

这就是方法引用 Java8特性。用::表示

  

2、什么情况下使用


当我们使用lamdba表达式,如果lamdba表达式实现体只调用了一个外部已经存在的方法时。

这种情况 就可以使用方法引用。

如上的例子 lamdba体中只调用了String的compareToIgnoreCase一个方法,就可以使用方法引用

 

3、分类


静态方法引用、实例方法引用、类型的实例方法引用、构造方法引用、数组构造方法引用

 

静态方法引用:

class Zoo{
    private int age;

    public Zoo(int age) {
        this.age = age;
    }
    
    public static int compareZoo(Zoo zoo1, Zoo zoo2){
        return zoo1.age - zoo2.age;
    }
}

public class LamdbaYf {
    public static void main(String[] args){
        List<Zoo> zooArray = Arrays.asList(new Zoo(3),new Zoo(2));
        Collections.sort(zooArray, (zoo1,zoo2) -> Zoo.compareZoo(zoo1,zoo2));
    }
}
View Code

如上使用lamdba方式,改为方法引用:

Collections.sort(zooArray, Zoo::compareZoo);

 

实例方法引用:

例子:

class Zoo{
    private int age;

    public Zoo(int age) {
        this.age = age;
    }

    public  int compareZoo(Zoo zoo1, Zoo zoo2){
        return zoo1.age - zoo2.age;
    }
}

public class LamdbaYf {
    public static void main(String[] args){
        List<Zoo> zooArray = Arrays.asList(new Zoo(3),new Zoo(2));
        Zoo zooInstance = new Zoo(4);
        Collections.sort(zooArray, zooInstance::compareZoo);
    }
}
View Code

 

类型的实例方法引用:

这点写法跟静态方法引用一样,但实际上调用的方法非static

例子:

public class LamdbaYf {
    public static void main(String[] args){
        List<String> strArray = Arrays.asList("aa","cc","bb");
        Collections.sort(strArray, String::compareTo);
    }
}
View Code

相当于lamdba表达式调用时,把第一个参数,作为实例再调用方法:

public class LamdbaYf {
    public static void main(String[] args){
        List<String> strArray = Arrays.asList("aa","cc","bb");
        Collections.sort(strArray, (a,b)->a.compareTo(b));
    }
}
View Code

有点绕,幸运的是 IDEA会自动帮我们检测,自动帮调整为 "类型的实例方法引用"

 

构造方法引用:

例子:

class Zoo{
    private int age=4;

    public int getAge() {
        return age;
    }

}
interface ZooCreate{
    Zoo create();
}

public class LamdbaYf {
    public static void testZoo(ZooCreate zooCreate){
        Zoo zoo = zooCreate.create();
        System.out.println("age="+zoo.getAge());
    }
    public static void main(String[] args){
        testZoo(Zoo::new);
    }
}
View Code

 

数组构造方法引用:

例子:

package com.yangfei.test.lamdba;

class Zoo{
    private int age=4;

    public int getAge() {
        return age;
    }

}
interface ZooCreate{
    Zoo[] create(int num);
}

public class LamdbaYf {
    public static void testZoo(ZooCreate zooCreate){
        Zoo[] zoo = zooCreate.create(5);
        System.out.println("age="+zoo[0].getAge());
    }
    public static void main(String[] args){
        ZooCreate zooCreate = Zoo[]::new;
        testZoo(zooCreate);
    }
}
View Code

 

转载于:https://www.cnblogs.com/yangfei629/p/11426986.html

### Java 方法引用详解 Java 方法引用提供了一种简洁的方式来表示已经存在的方法。通过使用双冒号 `::` 操作符,可以直接引用静态方法、实例方法以及构造器。 #### 静态方法引用 当目标方法是一个静态方法时,可以通过类名来引用方法: ```java // 假设有一个Comparator接口的实现需要比较两个整数大小 Comparator<Integer> comparator = Integer::compare; ``` 这里定义了一个 Comparator 对象,它利用了 Integer 类中的 compare() 静态方法来进行数值对比[^4]。 #### 实例方法引用 如果想要引用某个对象上的特定实例方法,则可以先创建好这个对象再做引用操作: ```java class Person { public String getName(){ return "John"; } } Person person = new Person(); Function<Void, String> function = person::getName; System.out.println(function.apply(null)); // 输出 John ``` 这段代码展示了如何将一个已有的对象的方法作为函数式接口的一部分传入其他地方使用。 #### 构造器引用 对于有参无返回值的情况也可以采用这种方式简化写法: ```java Supplier<Person> supplier = Person::new; Person p = supplier.get(); ``` 这相当于调用了默认构造函数创建一个新的 Person 实例。 #### 数组构造器引用 还可以用于数组类型的初始化过程之中: ```java IntFunction<int[]> intArrayCreator = int[]::new; int[] array = intArrayCreator.apply(10); ``` 上述例子表明即使是对基本数据类型组成的数组也同样适用这种方法引用机制。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值