方法引用_通过对象名引用成员方法
生活随笔
收集整理的這篇文章主要介紹了
方法引用_通过对象名引用成员方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
方法引用符
雙冒號:: 為引用運算符,而它所在的表達式被稱為方法引用。如果Lambda要表達的函數方案已經存在于某個方
法的實現中,那么則可以通過雙冒號來引用該方法作為Lambda的替代者。
語義分析
例如上例中, System.out 對象中有一個重載的println(String) 方法恰好就是我們所需要的。那么對于
printString 方法的函數式接口參數,對比下面兩種寫法,完全等效:
Lambda表達式寫法: s -> System.out.println(s);
方法引用寫法: System.out::println
第一種語義是指:拿到參數之后經Lambda之手,繼而傳遞給System.out.println 方法去處理。
第二種等效寫法的語義是指:直接讓System.out 中的println 方法來取代Lambda。兩種寫法的執行效果完全一
樣,而第二種方法引用的寫法復用了已有方案,更加簡潔。
注:Lambda 中 傳遞的參數 一定是方法引用中 的那個方法可以接收的類型,否則會拋出異常
推導與省略
如果使用Lambda,那么根據“可推導就是可省略”的原則,無需指定參數類型,也無需指定的重載形式——它們都
將被自動推導。而如果使用方法引用,也是同樣可以根據上下文進行推導。
函數式接口是Lambda的基礎,而方法引用是Lambda的孿生兄弟。
package com.learn.demo05.ObjectMethodReference; /*定義一個打印的函數式接口*/ @FunctionalInterface public interface Printable {//定義字符串的抽象方法void print(String s); } package com.learn.demo05.ObjectMethodReference;public class MethodRerObject {//定義一個成員方法,傳遞字符串,把字符串按照大寫輸出public void printUpperCaseString(String str){System.out.println(str.toUpperCase());} } package com.learn.demo05.ObjectMethodReference; /*通過對象名引用成員方法使用前提是對象名是已經存在的,成員方法也是已經存在就可以使用對象名來引用成員方法*/ public class Demo01ObjectMethodReference {//定義一個方法,方法的參數傳遞Printable接口public static void printString(Printable p){p.print("Hello");}public static void main(String[] args) {//調用printString方法,方法的參數Printable是一個函數式接口,所以可以傳遞Lambda表達式printString((s)->{//創建MethodRerObject對象MethodRerObject obj = new MethodRerObject();//調用MethodRerObject對象中的成員方法printUpperCaseString,把字符串按照大寫輸出obj.printUpperCaseString(s);});/*使用方法引用優化Lambda對象是已經存在的MethodRerObject成員方法也是已經存在的printUpperCaseString所以我們可以使用對象名引用成員方法*///創建MethodRerObject對象MethodRerObject obj = new MethodRerObject();printString(obj::printUpperCaseString);} }?
總結
以上是生活随笔為你收集整理的方法引用_通过对象名引用成员方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 方法引用基本介绍
- 下一篇: 方法引用_通过类名引用静态成员方法