Java功能接口

Java功能接口,java,functional-interface,Java,Functional Interface,我是Java8新手,我在互联网上读到了一些关于这个主题的东西。目前,我正试图弄清楚什么是功能接口。我已经找到了一些例子,但我不明白为什么接口Skip是函数式的,因为它有两个定义的方法。我希望有人能给我解释一下。代码是: @FunctionalInterface public interface Sprint { public void sprint(Animal animal); } @FunctionalInterface public interface Skip

我是Java8新手,我在互联网上读到了一些关于这个主题的东西。目前,我正试图弄清楚什么是功能接口。我已经找到了一些例子,但我不明白为什么接口Skip是函数式的,因为它有两个定义的方法。我希望有人能给我解释一下。代码是:

 @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接口只有一个默认的抽象方法,静态方法不计算在内——从sprint接口继承的sprint方法。因此,它是一个功能性接口。

考虑它的最佳方式是:将此接口的实例表示为单个lambda是否有意义?当接口中只有一个抽象方法时,这是正确的

Sprint有一种抽象的方法Sprint。此接口的lambda类似于:

Sprint sprint = animal -> {
    animal.doThingOne();
    animal.doThingTwo();
}
Skip有一个静态方法和一个默认方法。静态方法与实例无关;这就是Java中静态的含义。此外,默认方法不必在子类中实现,因为已经提供了默认实现。这意味着lambda只需在Skip-sprint中再次实现抽象方法,该方法从sprint继承即可生效。例如:

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

由于静态方法和默认方法不必由lambda实现,因此您可以拥有任意数量的方法,并且仍然有一个功能接口。

哦,我记得在一篇帖子中,有人谈到默认方法不算数。但是后来,有人说了相反的话,所以我不知道该怎么想。。那么,你的意思是一个函数接口可以有任意多的默认和静态方法吗?只要接口只有一个抽象方法,即没有实现的方法,它就是一个函数接口。默认方法和静态方法的数量无关紧要。如果您有疑问,请阅读官方文档:。它说:从概念上讲,函数接口只有一个抽象方法。因为默认方法有一个实现,所以它们不是抽象的。如果接口声明一个抽象方法覆盖java.lang.Object的一个公共方法,则该方法也不计入接口的抽象方法计数,因为接口的任何实现都将具有来自java.lang.Object或其他地方的实现。为什么人们从来不看医生?你可能想读一读