为何W3Schools示例中未显式定义的run()方法可运行?
为什么StringFunction接口无需显式实现类就能用Lambda赋值并调用方法?
这是Java 8引入的Lambda表达式和函数式接口特性在起作用,拆解来看:
StringFunction是函数式接口
Java规定:只要一个接口里只有一个抽象方法(哪怕没加@FunctionalInterface注解),就属于「函数式接口」。你的StringFunction正好符合这个条件——只有run(String str)这一个未实现的抽象方法,所以它自动被识别为函数式接口。Lambda是函数式接口的简化实现方式
你看到的(s) -> s + "!"这种Lambda表达式,本质是匿名内部类的语法糖,它等价于手动写一个实现了StringFunction的匿名类,比如:StringFunction exclaim = new StringFunction() { @Override public String run(String s) { return s + "!"; } };Lambda帮你省去了匿名类的模板代码,直接把方法的逻辑写在箭头后面。
赋值与调用的逻辑对应
当你把Lambda赋值给StringFunction类型的变量时,Java会自动把Lambda的逻辑绑定到接口的唯一抽象方法run()上。所以调用format.run(str)时,实际执行的就是你用Lambda定义的逻辑——比如exclaim对应的就是给字符串加感叹号,ask就是加问号。
简单说,Lambda就是Java为函数式接口量身打造的简化写法,不用再单独写实现类或匿名内部类,就能快速给接口的抽象方法定义具体行为。
内容的提问来源于stack exchange,提问作者Hao Han Lim
相关产品推荐
相关产品推荐

