JDK 8 见证了一个非凡特性的呈现:结构函数引用和要领引用。在本文中, Adrian D. Finlay 探讨了开拓人员如何释放结构函数引用的真正潜力。
要领引用的一些配景
假如你还不知道 Java 结构函数自己就是非凡的要领,那么阅读要领引用的根基示例将对读者有所辅佐,昆山软件开发,通过相识这些内容,可以相识结构函数引用是什么。
「要领引用为已经有名称的要领提供易读的 lambda 表达式。」
「它们提供了一种无需执行就可以引用要领的简朴方法。」
以上引自《Java 8 编程参考官方教程(第 9 版)》,作者:Herbert Schildt
译注:该书的第 8 版中文译本名称为:《Java 完全参考手册(第 8 版)》,第 9 版中文译本名称为:《Java 8 编程参考官方教程(第 9 版)》
要领引用可以引用静态要领和实例要领,两者是通用的。要领引用是函数式接口的实例。固然 Lambda 表达式答允你动态建设要领实现,但凡是环境下,一个要领最终会挪用 Lambda 表达式中的另一个要领来完成我们想要完成的事情。更直接的要领是利用要领引用。当你已经有一个要领来实现这个函数式接口时,这长短常有用的。
让我们看一个利用静态要领及实例要领的示例。
//step #1 - Create a funnctional interface. interface FuncInt { //contains one and only abstract method String answer(String x, boolean y); } //step #2 - Class providing method(s)that match FuncInt.answer()'s definition. class Answer { static String ans_math_static(String x, Boolean y) { return "\"" + x + "\"" + "\t = \t" + y.toString().toUpperCase(); } String ans_math_inst(String x, Boolean y) { return "\"" + x + "\"" + "\t = \t" + y.toString().toUpperCase(); } }
译注:以上代码的测试用譬喻下,因静态要领与实例要领功效沟通,仅以静态要领为例。
Answer.ans_math_static("9 > 11 ?", false); Answer.ans_math_static("987.6 < 1.1 ?", false); Answer.ans_math_static("1 > 0.9 ?", true); Answer.ans_math_static("T/F: Is Chengdu in Sichuan?", true); Answer.ans_math_static("-1 % 0.2=0 ?", false); Answer.ans_math_static("T/F: Does Dwyne Wade play for the Knicks?", false);
获得与原文举例沟通的输出功效:
"9 > 11 ?" = FALSE "987.6 < 1.1 ?" = FALSE "1 > 0.9 ?" = TRUE "T/F: Is Chengdu in Sichuan?" = TRUE "-1 % 0.2=0 ?" = FALSE "T/F: Does Dwyne Wade play for the Knicks?" = FALSE
另请参阅:关于var的所有内容:局部变量范例揣度如何排除Java代码冗余
利用要领引用的主要步调有:
类名 :: 要领名
;实例要领的要领引用名目为 工具实例名 :: 要领名
。Instance.AbstractMethod();
这提供了一种建设要领实现的可插拔方法。Lambda 表达式和要领引用为 Java 编程带来了一个成果方面的晋升。
另请参阅:你到底有多相识Java的注解?
结构函数的要领引用
让我们开始具体接头吧。
结构函数和其他要领一样是要领。对吗?错。它们有点非凡,它们是工具初始化要领。尽量如此,它们仍然是一个要领,没有什么能阻止我们像其他要领引用一样建设结构函数的要领引用。
//step #1 - Create a funnctional interface. interface FuncInt { //contains one and only abstract method Automobile auto(String make, String model, short year); } //step #2 - Class providing method(s)that match FuncInt.answer()'s definition. class Automobile { //Trunk Member Variables private String make; private String model; private short year; //Automobile Constructor public Automobile(String make, String model, short year) { this.make = make; this.model = model; this.year = year; } protected void what() { System.out.println("This Automobile is a" + year + " " + make + " " + model + "."); } } //Step #3 - Class making use of method reference public class ConstrRef { static void createInstance() { } public static void main(String[] args) { System.out.println(); //Remember, a Method Reference is an instance of a Functional Interface. Therefore.... FuncInt auto = Automobile::new;//We really don't gain much from this example //Example #1 Automobile honda = auto.auto("honda", "Accord", (short) 2006); honda.what(); //Example #1 Automobile bmw = auto.auto("BMW", "530i", (short) 2006); bmw.what(); System.out.println(); } }
输出功效
This Automobile is a2006 honda Accord. This Automobile is a2006 BMW 530i.
说明