方法引用让你可以重复使用现有的方法定义,并像Lambda一样传递它们。在一些情况下,比起使用Lambda表达式,它们似乎更易读,感觉也更自然。
方法引用可以被看作仅仅调用特定方法的Lambda的一种快捷写法。它的基本思想是如果一个Lambda代表的只是”直接调用这个方法“,那最好还是用名称来调用它,而不是去描述如何调用它。事实上,方法引用就是让你根据已有的方法实现来创建Lambda表达式。但是,显式地指明方法的名称,你的代码的可读性会更好。它是如何工作的呢?当你需要使用方法引用时,目标引用放在分隔符::前,方法的名称放在后面。例如,Apple::getWeight就是引用了Apple类中定义的方法getWeight。请记住,不需要括号,因为你没有实际调用这个方法。
如何构建方法引用?方法引用主要有三类:
- 指向静态方法的方法引用,例如Integer的parseInt方法,写作Integer::parseInt。
Lambda: (args) -> ClassName.staticMethod(args)
方法应用: ClassName::staticMethod
- 指向任意类型的实例方法的方法引用,例如String的length方法,写作String::length。
Lambda: (arg0, rest) -> arg0.instanceMethod(rest)
方法应用: ClassName::instanceMethod
- 指向现有对象的实例方法的方法引用,例如一个变量apple是Apple类型的对象,它支持实例方法getWeight,写作apple::getWeight。
Lambda: (args) -> expr.instanceMethod(args)
方法引用: expr::instanceMethod
对于一个现有构造函数,你可以利用它的名称和关键字new来创建它的一个引用:ClassName::new。它的功能与指向静态方法的引用类似。例如,假设有一个构造函数没有参数,它适合Supplier的签名() -> T。