方法參考
在使用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());
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/170355.html
標籤:Java
上一篇:Java生鮮電商平臺-生鮮小程式首頁系統功能詳解(小程式/APP)
下一篇:Zookeeper入門
