?
正文?
?代碼介紹:分別有兩個函數式接口Lazy跟LazyDependencyCreator,一個HashMap存儲<Object, LazyDependencyCreator>鍵值對。重點在于mProviders.put(AA.class,mAA::get),看了很久都沒看懂,mAA::get返回的不是mAA本身嗎,為什么能轉化為LazyDependencyCreator存儲在map里。
public interface Lazy<T> {T get();
}public class AA{}import java.util.HashMap;public class NewLambda {static Lazy<AA> mAA;private interface LazyDependencyCreator<T> {T createDependency();}private static final HashMap<Object, LazyDependencyCreator> mProviders = new HashMap<>();public static void main(String[] args) {mProviders.put(AA.class,mAA::get);//mProviders.put(AA.class, () -> mAA.get());}}
?雙冒號在這里的用法是方法引用,因為在 Java 中,方法引用可以被視為函數接口的實現,所以說mAA::get它本來就說一個函數式接口實例。
HashMap<Object, LazyDependencyCreator>這里的LazyDependencyCreator可以修改為任何函數式接口。
import java.util.HashMap;public class NewLambda {static Lazy<AA> mAA;private interface LazyDependencyCreator {void createDependency();//返回的是啥都行,跟返回值沒關系}private static final HashMap<Object, LazyDependencyCreator> mProviders = new HashMap<>();public static void main(String[] args) {mProviders.put(AA.class, mAA::get);}}
?另外,還是感覺LazyDependencyCreator接口很多余。
?這一段是我第一篇發布的錯誤想法,我怕是個傻子
漲知識了,在函數式接口的情景里,原來使用雙冒號是能省略方法調用的,具體原理不知道,反正就是能這樣用。
測試代碼如下:
代碼介紹:分別有兩個函數式接口Lazy跟LazyDependencyCreator,一個HashMap存儲<Object, LazyDependencyCreator>鍵值對。重點在于mProviders.put(AA.class,mAA::get),看了很久都沒看懂,mAA::get返回的不是mAA本身嗎,為什么能轉化為LazyDependencyCreator存儲在map里。
public interface Lazy<T> {T get();
}public class AA{}import java.util.HashMap;public class NewLambda {static Lazy<AA> mAA;private interface LazyDependencyCreator<T> {T createDependency();}private static final HashMap<Object, LazyDependencyCreator> mProviders = new HashMap<>();public static void main(String[] args) {mProviders.put(AA.class,mAA::get);//mProviders.put(AA.class, () -> mAA.get());}}
雙冒號有方法調用的作用我是知道的,在函數式接口里它能省略方法調用是第一次知道,記錄一下,另外,感覺LazyDependencyCreator接口很多余,下面這樣不也可以嗎。
public class NewLambda {static Lazy<AA> mAA;private interface LazyDependencyCreator<T> {T createDependency();}private static final HashMap<Object, Object> mProviders = new HashMap<>();public static void main(String[] args) {mProviders.put(AA.class, mAA.get());}}
?不理解。