方法引用

方法引用让你可以重复使用现有的方法定义,并像Lambda一样传递它们。在一些情况下, 比起使用Lambda表达式,它们更易读,感觉也更自然。
方法引用可以被看作仅仅调用特定方法的Lambda的一种快捷写法。
它的基本思想是,如果一个Lambda代表的只是“直接调用这个方法”,那最好还是用名称来调用它,而不是去描述如何调用它。
事实上,方法引用就是让你根据已有的方法实现来创建Lambda表达式。
当你需要使用方法引用时,目标引用放在分隔符::前,方法的名称放在后面。
例如,Apple::getWeight就是引用了Apple类中定义的方法getWeight。请记住,不需要括号,因为你没有实际调用这个方法。方法引用就是Lambda表达式(Apple a) -> a.getWeight()的快捷写法。
如何创建方法引用
方法引用主要有三类。
(1) 指向静态方法的方法引用(例如Integer的parseInt方法,写作Integer::parseInt)。
(2) 指向任意类型实例方法的方法引用(例如String的length方法,写作 String::length)。
(3) 指向现有对象的实例方法的方法引用(假设你有一个局部变量expensiveTransaction 用于存放Transaction类型的对象,它有个实例方法getValue,那么你就可以写expensive- Transaction::getValue)。
类似于String::length的第二种方法引用的思想就是你在引用一个对象的方法,而这个对象本身是Lambda的一个参数。
例如,Lambda 表达式(String s) -> s.toUppeCase()可以写作String::toUpperCase。
但第三种方法引用 指的是,你在Lambda中调用一个已经存在的外部对象中的方法。
例如,Lambda表达式
()->expensiveTransaction.getValue()
可以写作
expensiveTransaction::getValue。
构造函数引用
对于一个现有构造函数,你可以利用它的名称和关键字new来创建它的一个引用: ClassName::new。它的功能与指向静态方法的引用类似。例如,假设有一个构造函数没有参数。 它适合Supplier的签名() -> Apple。你可以这样做:
Supplier<Apple> c1 = Apple::new;
Apple a1 = c1.get();
这就等价于:
Supplier<Apple> c1 = () -> new Apple();
Apple a1 = c1.get();
从支持传递函数式代码,到lambda,到方法引用,我们看到Java8有了非常多的函数式编程的影子,这极大地提升了Java语言的灵活性,让代码极致简洁,结合流式api,我们会看到Java的编程风格已经越来越陌生,如果我们不能顺应技术的发展,及时跟进,真的会淹没在技术的潮流中!
网友评论