Java 8 - 功能接口与抽象类

时间:2013-11-13 09:27:35

标签: java functional-interface

我正在探索Java 8的功能,并遇到了“功能界面”

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

@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...");
    }
}

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

为什么要引入功能接口

5 个答案:

答案 0 :(得分:14)

  

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

     

为什么要引入功能接口。

可以扩展的类数:1

可以实现的接口数量:more than 1

答案 1 :(得分:3)

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

  • 类可以扩展多个功能接口
  • 功能界面可能只有单一抽象方法
  • 与C ++抽象类不同,功能接口可能没有字段

典型用法是您希望将默认功能嵌入对象的时间。即如果你有一个类似函数的对象,

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

class MyFunction2 {
    public List<String> apply(Integer s){
        ...
    }
}

你想要用它们制作一个乐曲,你只需要放入implements Function

class MyFunction1 implements Function<String, Integer>{
    public Integer apply(String s){
        ...
    }
}

class MyFunction2 implements Function<Integer, List<String>>{
    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);

差异

  • 无需重新实施功能。
  • 扩展课程中的
  • 其他可用功能composeidentity
  • 新默认功能是类层次结构的一部分无需创建新对象。通常像compose()这样的函数不包含在类定义中,因为它会导致类大小增长。它们通常被放入单独的实用程序类中。在Guava中,组合被放入一个单独的实用工具类FunctionsFunctions.compose。因此,使用新的功能接口,您无需回忆您的功能实现在哪个实用程序类中。

答案 2 :(得分:1)

功能接口必须只有一个方法。唯一的例外是在Object中声明的mehtods。见http://java.dzone.com/articles/introduction-functional-1

答案 3 :(得分:0)

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

答案 4 :(得分:0)

接口Comparator虽然显式地声明了两个方法,但它是有用的,因为只有一个是抽象的; equals是从Object继承的具体方法的显式声明,如果没有此声明,则会隐式声明。