方法引用 在使用Lambda表達式的時候,我們實際上傳遞進去的代碼就是一種解決方案:那參數做操作 弱國我們在Lambda中蘇哦指定的操作方案,已經有地方存在相同方案,那是否還有必要再寫重覆邏輯呢,答案肯定時沒有必要。 我們通過方法引用使用已經存在的方案 public interface PrintT ...
方法引用
在使用Lambda表達式的時候,我們實際上傳遞進去的代碼就是一種解決方案:那參數做操作
弱國我們在Lambda中蘇哦指定的操作方案,已經有地方存在相同方案,那是否還有必要再寫重覆邏輯呢,答案肯定時沒有必要。
我們通過方法引用使用已經存在的方案
public interface PrintTxt {
void PringString(String s);
}
public class Demo {
public static void main(String[] args) {
usePring( s -> System.out.println(s));
//方法引用符: "::"
usePring(System.out::print);
//可推到的就是可以省略的
}
static void usePring(PrintTxt pt){
pt.PringString("愛生活");
}
}
方法引用符
-
:: 該符號為引用運算符,而它所在的表達式被稱為方法引用
-
Lambda表達式: usePring( s -> System.out.println(s));
- 分析:拿到參數s之後通過Lambda表達式,傳遞給 System.out.println方法處理
-
方法引用:usePring(System.out::print);
*分析:直接使用System.out中的println方法取代Lambda,代碼更加簡潔
推導與省略
- 如果使用Lambda,那麼根據"可推到就是可省略"的原則,無需指定參數類型,也無需指定的重載形式,他們都將被自動推導
- 如果使用方法引用,也是同樣可以根據上下文進行推導
- 方法引用時Lambda的孿生兄的
Lambda表達式支持的方法引用
常見引用方式:
- 引用類方法
- 引用對象的實例方法
- 引用類的實例方法
- 引用構造器
引用類方法
其實就是引用靜態的方法
- 格式:類名::靜態方法
- 例:Integer::parseInt
- Integer類的方法:public static int parseInt(String s)將此String傳喚為int類型數據
public interface Converter {
int convert(String s);
}
public class Demo {
public static void main(String[] args) {
//Lambda表達式
useConverter(s -> Integer.parseInt(s));
//引用類方法
useConverter(Integer::parseInt);
//Lambda表達式被類方法替代的時候,它的形式參數全部傳遞給靜態方法作為參數
}
private static void useConverter(Converter c){
int convert = c.convert("1234");
System.out.println(convert);
}
}
引用對象的實例方法
就是引用類中的成員方法
- 格式:對象::成員方法
- 例:"HelloWorld"::toUpperCase
- String類中的方法:public String toUpperCase()將此String所有字元轉換為大寫
public interface Printer {
void printUpperCase(String s);
}
public class PrintString {
public void printUpper(String s){
String s1 = s.toUpperCase();
System.out.println(s1);
}
}
public class Demo {
public static void main(String[] args) {
//Lambda表達式
usePrinter(s -> System.out.println(s.toUpperCase()));
//引用對象的實例方法
PrintString ps = new PrintString();
usePrinter(ps::printUpper);
//Lambda表達式被對象的實例方法代替的時候,它的形式參數全部傳遞給該方法作為參數
}
private static void usePrinter(Printer p){
p.printUpperCase("HelloWorld");
}
}
引用類的實例方法
其實就是引用類中的成員方法
- 格式:類名::成員方法
- 例:String::substring
- String 類中的方法:public String usbstring(int beginIndex,int endIndex)
- 從beginIndex開始到endIndex結束,截取字元串。返回一個字串,字串的長度為endIndex-beginIndex
public interface MyString {
String mySubString(String s, int x, int y);
}
public class Demo {
public static void main(String[] args) {
//Lambda表達式
useMyString((s,x,y) -> s.substring(x,y));
//引用類的實例方法
useMyString(String::substring);
//Lambda表達式被類的實例方法替代的時候
//第一個參數作為調用者
//後面的參數全部傳遞給該方法作為參數
}
private static void useMyString(MyString m){
String s = m.mySubString("Helloworld", 2, 8);
System.out.println(s);
}
}
引用構造器
就是引用構造方法
- 格式:類名::new
- 例:Student::new
public interface StudentBuilder {
Student build(String name,int age);
}
public class Student {
String name;
int age;
public Student() {
}
public Student(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;
}
}
public class Demo {
public static void main(String[] args) {
//Lambda表達式
useStudentBuilder(((name, age) -> new Student(name,age)));
//引用構造器
useStudentBuilder(Student::new);
//Lambda表達式被構造器代替的時候,它的形式參數全部傳遞給構造器作為參數
}
private static void useStudentBuilder(StudentBuilder sb){
Student s = sb.build("張三", 20);
System.out.println(s.getName()+","+s.getAge());
}
}