1,方法引用
特殊的lambda表达式,它是对lambda表达式的一种简写方式。
在Java 8之前只能进行值传递,方法是不能传递的。如果你想调用一个方法你必须先获取到它所在的类的实例,然后再通过实例去调用这个方法,但是Java 8新增了方法引用这个新特性可以让你直接把方法当做值来传递。
若Lambda体中的内容已经存在对应的方法实现,即存在一个方法,参数列表和返回值于函数是接口一致,方法的实现内容也和Lambda体中的内容相同。则可直接使用方法引用如果我们想要调用的方法拥有一个名字,我们就可以通过它的名字直接调用它。
因为函数式接口的方法参数对应于隐式方法调用时的参数,所以被引用方法签名可以通过放宽类型,装箱以及组织到参数数组中的方式对其参数进行操作,就像在调用实际方法一样.
1.1,方法引用的种类
方法引用有很多种,它们的语法如下:
- 静态方法引用:
ClassName::methodName
- 实例上的实例方法引用:
instanceReference::methodName
- 超类上的实例方法引用:
super::methodName
- 类型上的实例方法引用:
ClassName::methodName
- 构造方法引用:
Class::new
。调用的构造方法是和函数式接口的参数类型一致的。 - 数组构造方法引用:
TypeName[]::new
- 主要常用的有以下四种:
1.2 静态方法引用
适用于:(args)->类名.静态方法(args). 当lambda表达式中方法体,只有一条语句,而这条语句是类名.静态方法。而静态方法的参数和lambda的参数一致时。
类名::静态方法;
1.3 实例方法引用
(args) -> inst.instMethod(args)
实例方法引用,顾名思义就是调用已经存在的实例的方法,与静态方法引用不同的是类要先实例化,静态方法引用类无需实例化,直接用类名去调用
package demo09;
import java.util.function.Function;
import java.util.function.Supplier;
public class Test09 {
public static void main(String[] args) {
//创建一个类对象
Student s=new Student("赵六",17);
//通过内置的函数接口,返回对象的名称。
// Supplier<String> supplier=()->s.getName();
Supplier<String> supplier=s::getName;
String s1 = supplier.get();
System.out.println(s1);
//观察: lambda表达式中有且仅有一条语句,方法调用调用语句。 ---实例方法引用特点: ()->对象.普通方法();
Function<Student,String> f=(t)->t.getName();
String apply = f.apply(s);
System.out.println(apply); //这里就无法使用方法引用。
}
}
class Student{
private String name;
private Integer age;//实体类中不能出现基本类型
public Student(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
1.4 对象方法引用
lambda: (inst,args)->inst.普通方法(args): -------->类名::普通方法
若Lambda参数列表中的第一个参数是实例方法的参数调用者,而第二个参数是实例方法的参数时,可以使用对象方法引用。
package demo09;
import java.util.function.BiFunction;
public class Test10 {
public static void main(String[] args) {
//判断两个字符串是否一致。
// BiFunction<String,String,Boolean> biFunction=(t1,t2)->t1.equals(t2);
// Boolean apply = biFunction.apply("hello", "hello");
// System.out.println(apply);
//观察:符合对象方法引用.----代码---进入公司---git拉取代码【看】---看懂
BiFunction<String,String,Boolean> biFunction=String::equals;
}
public static void show(BiFunction<String,String,Boolean> biFunction){
Boolean apply = biFunction.apply("hello", "hello");
System.out.println(apply);
}
}
1.5 构造方法引用
(args) -> new 类名(args)------构造方法引用: 类名::new
package demo09;
import java.util.function.BiFunction;
import java.util.function.Supplier;
public class Test11 {
public static void main(String[] args) {
// Supplier<Student> supplier=()->new Student();
// Student student = supplier.get();
// System.out.println(student);
//观察:调用的构造函数.
// Supplier<Student> supplier=Student::new;
// Student student = supplier.get();
// System.out.println(student);
// BiFunction<String,Integer,Student> biFunction=(n,a)->new Student(n,a);
BiFunction<String,Integer,Student> biFunction=Student::new;
Student student = biFunction.apply("霍梦琪", 25);
System.out.println(student);
}
}
总结:
静态方法引用 类名::静态方法 lambda表达式: (参数)->类名.静态方法(参数)
实例方法引用:对象::实例方法 lambda表达式: (参数)->对象.实例方法(参数)
对象方法引用:类名::实例方法 lambda表达式: (参数1,参数2....)->参数1.实例方法(参数2..)
构造方法引用: 类名::new lambda表达式: (参数)->new 类名(参数);