Java函数式接口中的“其他方法”由谁在何处实现?
Java函数式接口默认方法相关问题解答
问题1:当函数式接口通过lambda表达式传入实现方法时,上述“其他方法”由谁在何处实现?
这些所谓的“其他方法”本质都是JDK在对应函数式接口中预先实现好的默认方法(default method),你只需要用lambda实现接口唯一的抽象方法,生成的接口实例会自动继承接口中的所有默认方法实现,不需要额外编写代码。
举个例子,Predicate接口唯一的抽象方法是test(),and()、or()这些方法都是Predicate接口中已经写好逻辑的默认方法,你写Predicate<String> p = s -> s.length() > 3;的时候,只实现了test()方法,调用p.negate()的时候直接用接口自带的默认实现即可。
问题2:若“其他方法”的语义并非简单直接,比如Predicate的and()、or()、negate()逻辑复杂,现有默认实现无法覆盖需求时,是否需要自定义继承原有函数式接口的新接口,并自行实现所有“其他方法”?
不需要,分两种场景处理即可:
- 如果只是单次场景需要特殊逻辑,完全不用自定义接口,直接手动写组合后的lambda即可,不需要调用原有默认方法。比如你需要特殊的与逻辑,直接写
Predicate<String> customAnd = s -> 你自己的判断逻辑就行,不用非得用原生的and()方法。 - 如果自定义逻辑需要多处复用,可以自定义子接口继承原有函数式接口,且仅需要覆写你要修改逻辑的默认方法,其他未修改的默认方法会自动继承父接口的实现,不需要全部重写。
问题3:对于自带andThen()这类“其他方法”的函数式接口如BiFunction,是否需要继承该接口,新建一个带有andThen()默认方法的新接口?
完全不需要。BiFunction等JDK自带的函数式接口已经内置了andThen()的默认实现,直接调用即可,没有自定义需求的前提下不要重复实现已有功能。只有当你需要修改andThen()的默认执行逻辑时,才需要自定义子接口覆写该方法。
内容的提问来源于stack exchange,提问作者likejudo
相关产品推荐
相关产品推荐

