符号说明:
双冒号为方法引用运算符,而它所在的表达式被称为 方法引用
应用场景:如果Lambda表达式所要实现的方案,已经有其他方法存在相同的方案,那么则可以使用方
法引用。
重点:
方法引用,提供的方法一定要和函数式接口的方法是一样的入参和出参
例如:
/**
* @author jia
* @date 2022-08-27
* @desc com.example
* @since 1.0
*/
public class MethodRefrence {
/**
* 当这个方法和Consumer这个函数式接口中的accpt方法是一样的入参和出参时
* 就可以直接用方法引用了
*/
public void calcTotal(Integer[]numbers){
Integer total = 0;
for (int i = 0; i <numbers.length ; i++) {
total+=numbers[i];
}
System.out.println(total);
}
/**
* 调用consumer具体的实现
*/
public void printlnTotal(Consumer<Integer[]> consumer){
Integer[]numbers={12,12,3,12312,3,12,312,3,12,1};
consumer.accept(numbers);
}
public static void main(String[] args) {
MethodRefrence methodRefrence =new MethodRefrence();
//printlnTotal方法的参数 Consumer对象的方法正好和calcTotal是一样的出入参。就可以使用方法引用
methodRefrence.printlnTotal(methodRefrence::calcTotal);
}
}
常见的引用方式:
方法引用在JDK8中使用是相当灵活的,有以下几种形式:
- instanceName::methodName 对象::方法名
- ClassName::staticMethodName 类名::静态方法
- ClassName::methodName 类名::普通方法
- ClassName::new 类名::new 调用的构造器
- TypeName[]::new String[]::new 调用数组的构造器
-
对象:方法名
获取当前的时间戳:
Supplier函数式接口,正好提供了一个只有返回值的get()抽象方法,而now.getTime()方法,也正好是一个只有返回值的方法。所以可以直接使用方法引用
public static void main(String[] args) {
Date now =new Date();
Supplier<Long> supplier =()->{ return now.getTime(); };
Supplier<Long> supplierRefrence =now::getTime;
}
- 类名::静态方法
获取系统纳秒数:
Supplier函数式接口,正好提供了一个只有返回值的get()抽象方法,而System的静态方法nanoTime,也正好是一个只有返回值的方法。所以可以直接使用方法引用。注意:这里是直接了用了类的静态方法
public static void main(String[] args) {
Supplier<Long> supplier = ()->{ return System.nanoTime(); };
Supplier<Long> supplierRefrence = System::nanoTime;
}
- 类名::普通方法
类名::普通方法必须得是有入参的函数式接口才能用。这个类名实际上就是对于入参的一个代替。类名的实际值就是入参
image.png
- 类名::new 调用的构造器
函数式接口必须得是有返回值的才能用。
public static void main(String[] args) {
Supplier supplier = ()->{return new MethodRefrence();};
Supplier supplierRefrence = MethodRefrence::new;
}
- String[]::new 调用数组的构造器
函数式接口必须得是只有一个返回值,一个入参。入参作为数组的长度
public static void main(String[] args) {
Function<Integer, String[]> function = (len)->{return new String[len];};
Function<Integer, String[]> functionRefrence = String[]::new;
}
网友评论