前言
最近做了一个项目,项目使用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
语法
- 构造器引用: Class::new
- 静态方法引用 :Class::static_method
- 特定对象的特定方法调用 :object::method;
- 特定类的任意对象方法调用: 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
总结
其实方法引用概念还是比较简单,简而言之就是用类名::方法名来进行调用方法。最重要的是需要在实际场景中多加使用。