我正在探索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...");
}
}
但我怀疑的是,这是抽象类的用途。
为什么要引入功能接口。
答案 0 :(得分:14)
但我怀疑的是,这是抽象类的用途。
为什么要引入功能接口。
可以扩展的类数:1
可以实现的接口数量:more than 1
答案 1 :(得分:3)
功能接口用于“安全”多重继承。差异:
典型用法是您希望将默认功能嵌入对象的时间。即如果你有一个类似函数的对象,
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);
差异
compose
和identity
。compose()
这样的函数不包含在类定义中,因为它会导致类大小增长。它们通常被放入单独的实用程序类中。在Guava中,组合被放入一个单独的实用工具类Functions
:Functions.compose。因此,使用新的功能接口,您无需回忆您的功能实现在哪个实用程序类中。答案 2 :(得分:1)
功能接口必须只有一个方法。唯一的例外是在Object中声明的mehtods。见http://java.dzone.com/articles/introduction-functional-1
答案 3 :(得分:0)
我还没有JAVA 8的经验,但从我所看到的情况来看,这将允许一种多重继承,这对于抽象类是不可能的
答案 4 :(得分:0)
接口Comparator虽然显式地声明了两个方法,但它是有用的,因为只有一个是抽象的; equals是从Object继承的具体方法的显式声明,如果没有此声明,则会隐式声明。