Java 8-Lambda表达式-方法引用

方法引用让你可以重复使用现有的方法定义,并向Lambda一样传递它们。在一些情况下,比起使用Lambda表达式,它们似乎更易读,感觉也更自然。

方法引用可以被看作仅仅调用特定方法的Lambda的一种快捷写法。

它的基本思想是,如果一个Lambda代表的只是“直接调用这个方法”,那最好还是用名称来调用它,而不是去描述如何调用它。事实上,方法引用就是让你根据已有的方法实现来创建Lambda表达式。但是,显式地指明方法的名称,你的代码的可读性会更好。

当你需要使用方法引用时,目标引用放在分隔符::前,方法的名称放在后面。例如,Apple::getWeight就是引用了Apple类中定义的方法getWeight。请记住,不需要括号,因为你没有实际调用这个方法。方法引用就是Lambda表达式

(Apple a)->a.getWeight()的快捷写法。

可以把方法引用看作针对仅仅单一方法的Lambda的语法糖,因为你表达同样的事情时要写的代码更少了。

方法引用主要有三类:

  • 指向静态方法的方法引用(例如Integer的parseInt方法,写作Integer::parseInt)
  • 指向任意类型实例方法的方法引用(例如String的length方法,写作String::length)
  • 指向现有对象的实例方法的方法引用(假设你有一个局部变量expensiveTransaction用于存放Transaction类型的对象,它支持实例方法getValue,那么你就可以写expensiveTransaction::getValue)

类似于String::length的的第二种方法引用的思想就是你在引用一个对象的方法。但第三种方法引用指的是,你在Lambda中调用一个已经存在的外部对象中的方法。例如,Lambda表达式()->expensiveTransaction.getValue()可以写作expensiveTransaction::getValue。
只要方法引用的签名和接口对应的上就可以。可以通过类型指向静态方法或实例方法。还可以通过实例指向方法。

构造函数引用

//无参的构造函数
Supplier<Apple> c1=()->new Apple();
//等价于
Supplier<Apple> c1=Apple::new;

//有一个参数的构造函数
Function<Integer,Apple> c2=(weight)->new Apple(weight);
Function<Integer,Apple> c2=Apple::new;

构造函数引用的语法始终是ClassName::new,但需要与构造函数引用的签名匹配的函数式接口。

猜你喜欢

转载自blog.csdn.net/zsx157326/article/details/80870995