方法引用可以讓你重復(fù)使用現(xiàn)有的方法定義, 并像Lambda一樣傳遞它們. 如:
list.forEach( x -> System.out.println(x) );
使用方法引用可以這樣:
list.forEach( System.out::println );
方法引用可以看作是僅僅調(diào)用特定方法的Lambda表達(dá)式的一種快捷寫法。
需要使用方法引用時(shí), 目標(biāo)引用放在分隔符::前面, 方法名放在::的后面, 注意,只需要方法名不需要小括弧。
(Student stu) -> stu.getScore() 改為方法引用: Student::getScore
() ->Thread.currentThread().dumpStack() 改為方法引用: Thread.currentThread()::dumpStack
(Str, i) -> Str.substring(i) 改為方法引用: String::substring
a -> System.out.println(a) 改為方法引用: System.out::prinltn
方法引用主要有三類:
● 指向靜態(tài)方法的方法引用
Lambda表達(dá)式: (args) -> ClassName.staticMethod(args)
方法引用: ClassName::staticMethod
Integer[] data ={65,23,87,2,34,99};
Arrays.sort( data, Integer::compare );
● 指向任意類型的實(shí)例方法的引用
Lambda表達(dá)式 (args0, args1) -> args0.instanceMethod(args1)
args0是Classname類型的一個(gè)對(duì)象。
方法引用: Classname :: instanceMethod
● 指向現(xiàn)有對(duì)象的實(shí)例方法的引用
Lambda表達(dá)式: (args) -> obj.instanceMethod(args)
方法引用: obj::instanceMethod
public class Test05MethodReference {
public static void main(String[] args) {
Integer[] data ={65,23,87,2,34,99};
Arrays.sort( data, Integer::compare ); //引用靜態(tài)方法
System.out.println(Arrays.toString(data));
List<String> list = Arrays.asList("WKcto", "Abc", "XXx");
list.sort(String::compareTo); //引用實(shí)例方法
System.out.println(list);
list.forEach(System.out::println); //對(duì)System.out這個(gè)實(shí)例方法的引用
}
}
構(gòu)造方法引用
對(duì)于一個(gè)現(xiàn)有的構(gòu)造方法,可以使用類名和關(guān)鍵字new來(lái)創(chuàng)建一個(gè)構(gòu)造方法的引用: Classname::new
package com.wkcto.lambda;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;
/**
* author: 動(dòng)力節(jié)點(diǎn)老崔
* 2019/3/13
*/
public class Test06ConstructorReference {
public static void main(String[] args) {
//1)引用無(wú)參構(gòu)造方法
Supplier<Person> supplier = Person::new;
Person p1 = supplier.get();
System.out.println(p1);
//2)引用有一個(gè)參數(shù)的構(gòu)造方法
Function<String,Person> function = Person::new;
Person p2 = function.apply("feifei");
System.out.println( p2 );
//3)引用有兩個(gè)參數(shù)的構(gòu)造方法
BiFunction<String,Integer,Person> biFunction = Person::new;
Person p3 = biFunction.apply("feifei", 28);
System.out.println(p3);
//4)如果引用有三個(gè)參數(shù)及三個(gè)以上參數(shù)的構(gòu)造方法,需要自定義匹配的函數(shù)式接口
TriFunction<String, Integer, String, Person> triFunction = Person::new;
Person p4 = triFunction.apply("laodu", 35, "男");
System.out.println(p4 );
}
}
@FunctionalInterface
interface TriFunction<T,U,V,R>{
R apply(T t, U u, V v);
}
class Person{
String name;
int age;
String gender;
public Person(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public Person(String name, int 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 +
", gender='" + gender + '\'' +
'}';
}
}
Lambda練習(xí)
package com.wkcto.lambda;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
/**
* author: 動(dòng)力節(jié)點(diǎn)老崔
* 2019/3/13
*/
public class Test07Exercise {
public static void main(String[] args) {
//定義List集合存儲(chǔ)Student
List<Student> list = new ArrayList<>();
list.add( new Student("lisi", 80));
list.add( new Student("zhangsan", 30));
list.add( new Student("wangwu", 90));
list.add( new Student("feifei", 60));
list.add( new Student("mingge", 100));
System.out.println(list);
//使用匿名內(nèi)部類排序
list.sort(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.name.compareTo(o2.name);
}
});
System.out.println(list);
//使用Lambda表達(dá)式
list.sort((p1,p2) -> p2.name.compareTo(p1.name));
System.out.println(list);
//Comparator接口中有一個(gè)comparing靜態(tài)方法返回Comparator比較器
list.sort(Comparator.comparing((stu)->stu.name));
System.out.println(list);
//方法引用,Student類中g(shù)etScore方法返回成績(jī)
list.sort(Comparator.comparing(Student::getScore));
System.out.println(list);
}
}
class Student{
String name;
int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", score=" + score +
'}';
}
public int getScore() {
return score;
}
}