Java8-函数接口与抽象类

Java8-函数接口与抽象类,java,functional-interface,Java,Functional Interface,我在探索Java8的特性时遇到了“功能接口” 根据我的理解,这些接口可以有一些默认的实现方法,如: @FunctionalInterface public interface ComplexFunctionalInterface extends SimpleFuncInterface { default public void doSomeWork() { System.out.println("Doing some work in interface impl

我在探索Java8的特性时遇到了“功能接口”

根据我的理解,这些接口可以有一些默认的实现方法,如:

@FunctionalInterface
public interface ComplexFunctionalInterface extends SimpleFuncInterface 
{
    default public void doSomeWork()
    {
        System.out.println("Doing some work in interface impl...");
    }
    default public void doSomeOtherWork()
    {
        System.out.println("Doing some other work in interface impl...");
    }
}
但我怀疑的是,这就是抽象类的用途

为什么要引入功能接口

但我怀疑的是,这就是抽象类的用途

为什么要引入功能接口

可扩展的类数:
1


可以实现的接口数量:
超过1个

我还没有使用JAVA 8的经验,但从我所看到的情况来看,这将允许一种多重继承,这在抽象类中是不可能的

接口比较器是功能性的,尽管它明确声明了两种方法,因为只有一个是抽象的;equals是从对象继承的具体方法的显式声明,如果没有此声明,该方法将被隐式声明。

函数接口必须只有一个方法。唯一的例外是在对象中声明的方法。请参见

功能接口用于“安全”多重继承。差异:

  • 一个类可以扩展多个功能接口
  • 功能接口可能只有一个抽象方法 函数接口可能没有与C++抽象类不同的域。
典型用法是在对象中嵌入默认功能。也就是说,如果你有一个类似于对象的函数

class MyFunction1 {
    public Integer apply(String s){
        ...
    }
}

class MyFunction2 {
    public List<String> apply(Integer s){
        ...
    }
}
您可以创建函数的组合。比较了两种方法:

无功能接口:

MyFunction1 myFunction1 = ...;
MyFunction2 myFunction2 = ...;

Function<String, List<String>> composition = (s) -> myFunction2.apply(myFunction1.apply(s));
MyFunction1 myFunction1 = ...;
MyFunction2 myFunction2 = ...;

Function<String, List<String>> composition = myFunction1.andThen(myFunction2);
MyFunction1 MyFunction1=。。。;
MyFunction2 MyFunction2=。。。;
函数组合=(s)->myFunction2.apply(myFunction1.apply(s));
具有功能接口:

MyFunction1 myFunction1 = ...;
MyFunction2 myFunction2 = ...;

Function<String, List<String>> composition = (s) -> myFunction2.apply(myFunction1.apply(s));
MyFunction1 myFunction1 = ...;
MyFunction2 myFunction2 = ...;

Function<String, List<String>> composition = myFunction1.andThen(myFunction2);
MyFunction1 MyFunction1=。。。;
MyFunction2 MyFunction2=。。。;
函数组合=myFunction1。然后(myFunction2);
差异

  • 无需重新执行功能
  • 扩展类中可用的其他函数:
    compose
    identity
  • 新的默认函数成为类层次结构的一部分,无需创建新对象。通常像
    compose()
    这样的函数不包括在类定义中,因为它会导致类大小的增长。它们通常被放入不同的实用程序类中。在番石榴中,成分被放入一个单独的实用程序类
    函数
    :。因此,对于新的函数接口,您不需要回忆在哪个实用程序类中实现了您的函数

这是唯一的原因吗?Java在jdk1.7之前非常支持没有多重继承,现在仍然没有多重继承。您只能从一个源继承,但可以实现多个接口-与以前相同。继承图仍然是一个有向无环图。但是,通过实现多个函数接口,钻石问题不会出现吗?@Batty显然钻石问题只有在函数接口中提供默认函数实现时才会出现(也是一个新事物)-编译器通过在接口中找到多个默认实现时强制实现类提供这些方法的实现来解决此问题。它仍然不是多重继承。@MarkusKoivisto:为什么不?可以将变量和方法与主体一起使用。你说这不是多重继承吗?如果两个接口的方法都是“public Integer apply(String s)”,这不是问题吗?如果函数接口的抽象方法具有相同的签名,这将导致编译时错误。我把这理解为方法内联——一个人的类中不能有重复的方法。