有没有办法在定义lambda时调用默认方法?
E.g。
@FunctionalInterface
public interface StringCombiner {
String combine(String s1, String s2);
default String bar(String s1, String s2) {
return combine(s1,s2);
};
}
我想做这样的事情:
StringCombiner sc = (s1, s2) -> /** I want to call bar() here **/
答案 0 :(得分:3)
这将导致StackOverflowError:bar
调用combine
,调用bar
,调用combine
...
您需要在其定义中递归引用sc
(您不能在lambda中使用this
来引用lambda创建的对象)。我相信只有在实例或类变量中才有可能。所以它看起来像:
@FunctionalInterface
public interface StringCombiner {
String combine(String s1, String s2);
default String bar(String s1, String s2) { return "bar"; }
}
//Note: you need the static block to avoid a "self-reference" compilation error
static StringCombiner sc;
static {
sc = (s1, s2) -> sc.bar(s1, s2) + s1 + s2;
}
public static void main(String[] args) {
System.out.println(sc.combine("a", "b"));
}
打印barab
。