文章目錄
- 方法引用的新特性
- 方法引用的常用方式
- 通過對象名引用成員方法
- 通過類名的靜态成員方法
- 構造器引用
方法引用的新特性
- 在上篇文章《深入了解Java Stream流》結尾處,我們通過一個具體的例子展現了Stream流的應用,其中有這樣一段代碼:
public static void main(String[] args) {
// 建立兩個班級的學生集合
...
// 通過流的方式得出兩個班級的超過90分的前三名學生
...
// 合并兩個流對象,并進行排序輸出
Stream.concat(stream1, stream2).sorted((s1,s2)->s1.compareTo(s2)).forEach(student -> System.out.println(student));
}
// 學生類
class Student implements Comparable {
...
@Override
public int compareTo(Object o) {
if (o instanceof Student){
return ((Student) o).score-this.score;
}
return -1;
}
}
- 在JDK8中引入了“方法引用“的新特性”,可以對Lambda表達式進行簡化:
Stream.concat(stream1, stream2).sorted(Student::compareTo).limit(3).forEach(student -> System.out.println(student));
即sorted((s1,s2)->s1.compareTo(s2))簡寫成了sorted(Student::compareTo)(雙冒号::為引用運算符)。
方法引用的常用方式
使用方式 | 描述 |
對象名引用 | object :: instanceMethodName |
靜态方法引用 | ClassName :: staticMethodName |
構造器引用 | ClassName :: new |
通過對象名引用成員方法
- 對象名已經存在,成員方法已經存在,則可以使用對象名來引用成員方法
/**
* 通過對象名引用成員方法
*
* @author zhuhuix
* @date 20200802
*/
public class FunctionReference01 {
// 方法
public static void printString(Printable printable,String s) {
printable.print(s);
}
public static void main(String[] args) {
String string = "abcdefg";
//傳統文法
// printString(s -> {
// UpperCase upperCase = new UpperCase();
// upperCase.stringUpperCase(s);
// },string);
// 建立字母大定轉換的對象
UpperCase upperCase = new UpperCase();
// 通過對象名引用成員方法實作字母大寫轉換
printString(upperCase::stringUpperCase,string);
}
}
// 函數式接口
@FunctionalInterface
interface Printable{
void print(String s);
}
// 定義一個字母大寫轉換的類和大寫轉換的成員方法
class UpperCase {
public void stringUpperCase(String s) {
System.out.println(s.toUpperCase());
}
}

通過類名的靜态成員方法
- 類名已經存在,靜态成員方法已經存在,則可以使用類名來引用靜态成員方法
/**
* 通過類名引用靜态成員方法
*
* @author zhuhuix
* @date 20200802
*/
public class FunctionReference02 {
// 方法
public static void printString(Printable printable,String s) {
printable.print(s);
}
public static void main(String[] args) {
String string = "abcdefg";
// 通過類名引用靜态成員方法實作字母大寫轉換
printString(UpperCase::stringUpperCase,string);
}
}
// 函數式接口
@FunctionalInterface
interface Printable{
void print(String s);
}
// 定義一個字母大寫轉換的類和大寫轉換的成員方法
class UpperCase {
public static void stringUpperCase(String s) {
System.out.println(s.toUpperCase());
}
}
構造器引用
/**
* 構造器引用
*
* @author zhuhuix
* @date 20200802
*/
public class FunctionReference03 {
// 方法
public static void build(PersonBuilder personBuilder,String name,int age) {
Person person= personBuilder.builerPerson(name,age);
System.out.println(person.toString());
}
public static void main(String[] args) {
// 構造器方法引用
build(Person::new,"Jack",16);
build(Person::new,"Mike",17);
build(Person::new,"Rose",18);
}
}
// 通過姓名與年齡建立person對象
@FunctionalInterface
interface PersonBuilder{
Person builerPerson(String name,int age);
}
class Person{
String name;
int age;
Person(){}
Person(String name,int age){
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}