从lambdas调用默认方法

时间:2014-02-14 10:20:41

标签: java lambda java-8

有没有办法在定义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 **/

1 个答案:

答案 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