符号表示: ::
符号说明:双冒号为方法引用运算符,而它所在的表达式被称为方法引用。
常用的引用方式:
1、instanceName::methodName 对象::方法名
2、ClassName::staticMethodName 类名::静态方法
3、ClassName::MethodName 类名::普通方法
4、ClassName::new 类名::new 调用的构造器
5、TypeName[]::new String[]::new 调用数组构造器
方法引用的注意事项
1. 被引用的方法,参数要和接口中抽象方法的参数一样
2. 当接口抽象方法有返回值时,被引用的方法也必须有返回值
目录
方法引用的几种常用方式
对象名::引用成员方法
类名::引用静态方法
类名::引用实例方法
类名::new 引用类构造器
数组::new 引用数组构造器
对象名::引用成员方法
当一个类中已经存在成员方法,我们需要使用时,可以使用方法引用的方式.
//对象名引用成员方法 对象名::方法名
@Test
public void testObject(){
Date date = new Date();
//使用Lambda表达式方式
Supplier<Long> sup = ()->{
return date.getTime();
};
System.out.println("时间 :"+sup.get());
//使用方法引用 简写上述Lambda表达式
Supplier<Long> supp = date::getTime;
System.out.println("supp : "+supp.get());
}
类名::引用静态方法
当某个类中已经存在我们需要使用的静态方法时,就可以直接使用方法引用的方式
//方法引用之类名调用静态方法 类名::静态方法
@Test
public void test2(){
Supplier<Long> sup = System::currentTimeMillis;
System.out.println("sup : "+sup.get());
}
类名::引用实例方法
java面向对象中,类名只能调用静态方法,而类名引用实例方法,需要使用第一个参数作为方法的调用者
//方法引用之实例方法引用 实际上是拿第一个参数作为方法的调用者 类名::方法名
@Test
public void test3(){
Function<String,Integer> fun = (s)->{
return s.length();
};
System.out.println("fun : "+fun.apply("hello"));
//使用类名::方法名 进行方法引用操作
Function<String,Integer> fun2 = String::length;
System.out.println("fun2 : "+fun2.apply("dongdong"));
BiFunction<String,Integer,String> bi = String::substring;
System.out.println("bi :"+bi.apply("hello",2));
}
类名::new 引用类构造器
构造器名称和类名完全一致,所以调用构造器时使用 类名称::new 的格式。先造个类Person
public class Person {
private String name;
private Integer age;
public Person() {
}
public Person(String name) {
this.name = name;
}
public Person(String name, Integer age) {
this.name = name;
this.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;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
然后通过方法引用调用该类的构造器
//方法引用之构造方法引用 类名::new
@Test
public void test4(){
Supplier<Person> sup = ()->{
return new Person();
};
System.out.println("sup : "+sup.get());
//方法引用调用构造器
Supplier<Person> supp = Person::new;
System.out.println("supp : "+supp.get());
//方法引用调用带参构造器
BiFunction<String,Integer,Person> bi = Person::new;
System.out.println("bi : "+bi.apply("张三",18));
}
数组::new 引用数组构造器
数组也是Object的子类对象,所以同样具有构造器,只是语法不一样罢了。
//方法引用之数组构造方法引用 String[]::new 调用数组构造器 String[]可以是其他类型的构造器
@Test
public void test5(){
Function<Integer,String[]> fun = (len)->{
return new String[len];
};
System.out.println("fun : "+fun.apply(10));
//方法引用 数组构造器
Function<Integer,String[]> fun2 = String[]::new;
String[] arr = fun2.apply(10);
System.out.println("arr :"+arr.length);
}
方法引用实际是对Lambda表达式复合特定情况下的一种缩写形式,使Lambda表达式更加简洁,但需要注意的是方法引用的方法是必须要存在的方法才行。