本文主要是介绍【Java 8】Lambda: mAA::get 返回函数式接口实例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
正文
代码介绍:分别有两个函数式接口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());}}
不理解。
这篇关于【Java 8】Lambda: mAA::get 返回函数式接口实例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!