1、作用
什么是方法引用:方法引用是jdk8推出的一个新特性,在一定的条件下可以替换lambda表达式,可以理解为方法引用实际上还是一个lambda表达式。lambda表达式用法可参见:https://blog.csdn.net/xiao_yu_gan/article/details/124095300
方法引用的作用:可以在一定条件下简化lambda表达式写法,旨在编写更加简洁紧凑的代码风格,提高代码重用率,不提高执行效率。
可简单理解为:如果一个lambda表达式大括号中的代码仅仅是调用了另外一个方法,此时可用方法引用替换此lambda表达式。
注意:方法引用旨在简化lambda表达式写法,在lambda表达式的基础上使用,不能脱离lambda表达式单独使用。
2、语法
(函数式)接口类型 对象变量名 = 对象::被引用的实例方法;
(函数式)接口类型 对象变量名 = 类名::被引用的静态方法;
(函数式)接口类型 对象变量名 = 类名::被引用的普通方法;
(函数式)接口类型 对象变量名 = 类名::new(引用的是类的构造方法);
“=”号左边函数式接口抽象方法的参数列表、返回值类型需要与右边被引用的方法的参数列表、返回值类型一致。
3、演示使用
对象::实例方法
/**
* 1、使用Date对象实例方法
*/
public class Demo {
public static void main(String[] args) {
Date date = new Date();
/**
* lambda表达式写法
*/
Supplier<Long> currentTimeLambda = ()->date.getTime();
System.out.println(currentTimeLambda.get());
/**
* 方法引用写法
*/
Supplier<Long> currentTimeQuote = date::getTime;
System.out.println(currentTimeQuote.get());
}
}
/**
* 2、使用自定义类对象实例方法
*/
public class Demo {
public static void main(String[] args) {
Person person = new Person("张三");
/**
* lambda表达式写法
*/
Supplier<String> personNameLambda = ()->person.getName();
System.out.println(personNameLambda.get());
/**
* 方法引用写法
*/
Supplier<String> personNameQuote = person::getName;
System.out.println(personNameQuote.get());
}
}
class Person{
private String name;
public String getName() {
return name;
}
public Person(String name) {
this.name = name;
}
}
类名::静态方法
/**
* 1、使用System类静态方法
*/
public class Demo {
public static void main(String[] args) {
/**
* lambda表达式写法
*/
Supplier<Long> currentTimeLambda = ()->System.currentTimeMillis();
System.out.println(currentTimeLambda.get());
/**
* 方法引用写法
*/
Supplier<Long> currentTimeQuote = System::currentTimeMillis;
System.out.println(currentTimeQuote.get());
}
}
/**
* 2、使用自定义类静态方法
*/
public class Demo {
public static void main(String[] args) {
/**
* lambda表达式写法
*/
Supplier<String> personNameLambda = ()->Person.getName();
System.out.println(personNameLambda.get());
/**
* 方法引用写法
*/
Supplier<String> personNameQuote = Person::getName;
System.out.println(personNameQuote.get());
}
}
class Person{
private static String name = "李四";
public static String getName() {
return name;
}
}
/**
* 3、使用带参数的方法引用
*/
public class Demo {
public static void main(String[] args) {
/**
* lambda表达式写法
*/
Function<Integer,Integer> squaredLambda = (val)->MyMath.squaredValue(val);
System.out.println(squaredLambda.apply(3));
/**
* 方法引用写法
*/
Function<Integer,Integer> squaredquote = MyMath::squaredValue;
System.out.println(squaredquote.apply(5));
}
}
class MyMath{
/**
* 求平方值
*/
static Integer squaredValue(Integer val){
return val*val;
}
}
类名::new
public class Demo {
public static void main(String[] args) {
/**
* lambda表达式写法
*/
Supplier<Person> personLambda = ()->new Person();
System.out.println(personLambda.get());
/**
* 方法引用写法(无参构造)
*/
Supplier<Person> personQuoteNoPa = Person::new;
System.out.println(personQuoteNoPa.get());
/**
* 方法引用写法(一个参数构造)
*/
Function<String,Person> personQuoteOnePa = Person::new;
System.out.println(personQuoteOnePa.apply("张三"));
/**
* 方法引用写法(两个参数构造)
*/
BiFunction<String,Integer,Person> personQuoteTwoPa = Person::new;
System.out.println(personQuoteTwoPa.apply("李四",24));
}
}
class Person{
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public Person(String name) {
this.name = name;
}
public Person() {
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}