Java8新特性-方法引用

前言

最近做了一个项目,项目使用JKD11 其中使用了大量的JKD8的新特性,于是学习总结了一波。

方法引用

方法引用 是Java 8 发布特性的特性之一。

方法引用是用更加简短的名字来调用方法。

它可以算做是Lambda表达式只调用方法的一种更加简短的表达。

示例:

    public static void main(String[] args) {
        List<Integer> integers = Arrays.asList(1,2,3,4,5);
        //输出数组中的值 方法引用
        integers.forEach(System.out::println);
        System.out.println("=============");
        //输出数组中的值 lambda表达式
        integers.forEach(x-> System.out.println(x));
    }
1
2
3
4
5
=============
1
2
3
4
5

语法

  1. 构造器引用: Class::new
  2. 静态方法引用 :Class::static_method
  3. 特定对象的特定方法调用 :object::method;
  4. 特定类的任意对象方法调用: Class::method

在使用方法引用时需要注意:

方法引用其实是lamdba表达式在只需要调用方法下的一种更加简单的写法。所以,在使用方法引用的地方,它需要传入的参数一定的是一个函数式接口。

方法引用示例

先创建一个用来测试的实体类

public class Car {
    private String speed;
	//用来测试调用无参构造器引用
    public Car() {
    }
    //用来测试调用有参构造器引用
    public Car(String speed) {
        this.speed = speed;
    }
     //java8 的一个函数式接口	Supplier<T>   无参数,返回一个结果。
    //用来测试调用无参构造器引用
    public static Car create( Supplier<Car> supplier) {
        return supplier.get();
    }
    //Function 是java8有一个参数有一个返回值的函数式接口。
     //用来测试调用有参构造器引用
    public static Car create( Function<String,Car> supplier,String speed) {
        return supplier.apply(speed);
    }

	//用来测试静态方法引用
    public static void run(Car car){
        System.out.println("唱、跳、rap");
    }

    //用来测试调用
    public void getSpeed() {
        if(speed ==null)
            System.out.println("飞不起来飞不起来");
        else
            System.out.println("速度"+speed+"迈");
    }
    //用来测试调用特定类的任意对象方法调用:
    public String play(){
        return "播放音乐,速度"+speed;
    }

	//用来测试特定对象的特定方法调用:
    public void setSpeed(String speed) {
        this.speed = speed;
    }

}

编写测试方法

    public static void main(String[] args) throws IOException {
        //调用无参构造方法
        Car car = Car.create(Car::new);
        List<Car> cars = new ArrayList<>();
        cars.add(car);
        cars.forEach(Car::getSpeed);
        //调用有一个入参的构造方法。
        System.out.println("======");
        Car car1 = Car.create(Car::new ,"70") ;
        List<Car> cars1 = new ArrayList<>();
        cars1.add(car1);
        cars1.forEach(Car::getSpeed);
        System.out.println("========");
        //静态方法引用  化为lambda表达式为:  (x)->Car.run(x)
        // 这里要传一个参数是因为forEach接受的是一个Consumer函数式接口  接受一个参数,无返回结构
        cars1.forEach(Car::run);
        //特定对象的特定方法引用  Supplie   是无参数 , 返回一个参数的 函数式接口。
        Supplier supplier = car::play;
        Supplier supplier1 = car1::play;
        System.out.println(supplier.get());
        System.out.println(supplier1.get());

    }

结果

飞不起来飞不起来
======
速度70========
唱、跳、rap
播放音乐,速度null
播放音乐,速度70

总结

其实方法引用概念还是比较简单,简而言之就是用类名::方法名来进行调用方法。最重要的是需要在实际场景中多加使用。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值