極簡的藝術-方法參考
在JDK1.8中,方法參考同Lambda運算式一齊作為新特性被參考,它是一種比Lambda運算式更加簡便的書寫方式,旨在使用通用的解決方案來減少代碼冗余,
下面先介紹使用,再進一步思考,
一、書寫格式
方法參考符:::,它所在的運算式被稱為方法參考
格式:參考類::參考的方法
示例:System.out::println
二、使用方式
下面通過使用方式來認識方法參考
1.參考類方法
參考類方法,即參考類的靜態方法,
格式:類名::靜態方法
示例:
以參考Integer.parseInt為例,設存在一個介面Interface01,其中只包含一個抽象方法,希望實作類可以實作將傳入的字串轉換為int型別,
public interface Interface01 {
int toInt(String s);
}
在測驗方法seeInt中,使用了該介面的toInt方法
private static void seeInt(Interface01 i){
int i1 = i.toInt("666");
//通過運算子,可以在呼叫后通過輸出結果看出 i1 是String還是int
System.out.println(i1+222);
}
現在使用測驗類來提供介面的實作,此處提供三種實作方式以便于比較
public class Demo1 {
public static void main(String[] args) {
//我們常用Integer.parseInt來實作將String轉換為int
//匿名內部類方式,
seeInt(new Interface01() {
@Override
public int toInt(String s) {
return Integer.parseInt(s);
}
});
//Lambda運算式
seeInt(s -> Integer.parseInt(s));
//方法參考,
//參考Integer類中的parseInt靜態方法
seeInt(Integer::parseInt);
}
private static void seeInt(Interface01 i){
int i1 = i.toInt("666");
//通過運算子,可以在呼叫后通過輸出結果看出 i1 是String還是int
System.out.println(i1+222);
}
}
得到輸出結果
888
888
888
在該例中,將String轉換為int已經有一個成熟的解決方案,即Integer.parseInt,所以直接參考了該方法,此時,Integer.parseInt就是Interface01介面中toInt抽象方法的具體實作
此時出現一個疑問,參考的這個方法是怎么處理引數的?
我們可以對比一下:
- toInt方法需要一個入參(String),回傳一個出參(int)
- Integer.parseInt多載中存在一個方法是 需要一個入參(String),回傳一個出參(int)
此時兩者可以對應上,編譯器將自動處理傳參問題,
2.參考物件的實體方法
參考物件的實體方法,和參考類的靜態方法在使用上沒有什么區別只是將類變更為物件,注意:物件需要實體化
格式:物件名::方法名
示例:
public class Demo3 {
public static void main(String[] args) {
//參考物件的實體方法,和靜態方法沒有使用上的區別只是要new一下
Demo3 demo3 = new Demo3();
useInterface(demo3::method1);
}
private static void useInterface(Interface03 i){
i.abMethod1();
}
public void method1(){
System.out.println("111");
System.out.println("222");
System.out.println("333");
}
}
interface Interface03 {
void abMethod1();
}
3.特殊型別的實體方法
java中存在某些特殊方法,
以"".subString([start],[end])為例,它在使用時需要三個引數,即
- 被截取的字串(“”)
- 截取的開始下標([start])
- 截取的結束下標([end])
示例:使用Lambda和方法參考使用格式為:
public static void main(String[] args) {
//lambda
testInterface((s,start,end) -> s.substring(start,end));
/*
方法參考
第一個引數作為方法呼叫者
后面的引數作為方法的引數
*/
testInterface(String::substring);
}
4.構造方法參考
直接上代碼演示
格式:類名::new
示例:
public static void main(String[] args) {
//Lambda
seeStudent((name,age) -> {
return new Student(name,age);
});
//方法參考 他的形式引數全部傳遞給構造器
seeStudent(Student::new);
}
思考
學習一個新知識的時候,我總有這樣的疑問:為什么要學它,什么時候去用它,怎么用它呢?(這個和高中作文的議論文格式一樣...看來學議論文還是有幫助的=,=)
所以此處的問題是:為什么需要方法參考,什么時候使用方法參考呢?
在方法參考的學習時,我產生了這樣的思考
- 當介面只需要實作一次 -> 使用匿名內部類
- 作為匿名內部類的簡便寫法 -> 使用Lambda運算式
- 當Lambda的實作存在通用解決方案 -> 使用方法參考
當”一個介面/類的方法的某個實作方式在程式中只會執行一次“時,為了減少代碼量,我們會使用匿名內部類,
而使用方法參考會參考一個通用解決方案,此時該解決方案就不屬于”只使用一次”的了,
換言之,
當程式中使用到介面,介面在某個類中已存在實作方式,就可以考慮使用“方法參考”的方式來簡化書寫
總結:
- 方法參考是Lambda的一種簡便寫法
- 使用方法參考可以減少重復代碼,減少冗余
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/238327.html
標籤:Java
上一篇:Flink 反壓 淺入淺出
下一篇:精盡Spring MVC原始碼分析 - HandlerAdapter 組件(五)之 HttpMessageConverter
