Java 功能界面

Java functional interface

我是 Java8 的新手,我在 Internet 上阅读了一些有关此主题的内容。目前我正试图弄清楚什么是功能接口。我找到了一些例子,但我不明白为什么接口 Skip 是一个函数式接口,因为它有 2 个定义的方法。我希望有人能给我解释一下。代码是:

 @FunctionalInterface
 public interface Sprint 
 {
     public void sprint(Animal animal);
 }


 @FunctionalInterface
 public interface Skip extends Sprint 
 {

      public default int getHopCount() 
      {
         return 10;
      }

      public static void skip(int speed) {}
 }

你的Skip接口只有一个抽象方法(defaultstatic方法不算)——继承自[=14=的sprint方法] 界面。因此它是一个功能接口。

最好的思考方式是:将此接口的实例表示为单个 lambda 是否有意义?当您的界面中只有一个 abstract 方法时就是如此。

Sprint 有方法 sprint(),即 abstract。此接口的 lambda 类似于:

Sprint sprint = animal -> {
    animal.doThingOne();
    animal.doThingTwo();
}

Skip有一个static方法和一个default方法。 static 方法与实例无关;这就是Java中static的意思。此外,default 方法不必在子类中实现,因为已经提供了默认实现。这意味着一个lambda只需要实现Skip中的抽象方法(又是sprint(),继承自Sprint)才有效。示例:

Skip skip = Animal::doThingThree; // Equivalent to: animal -> animal.doThingThree()

由于 staticdefault 方法不必由 lambda 实现,您可以拥有任意数量的函数接口。