在Java中一个接口一旦发布就已经被定型,除非咱们可以一次性的更新全部该接口的实现,否者在接口的添加新方法将会破坏现有接口的实现。默认方法就是为了解决这一问题的,这样接口在发布以后依然可以继续演化。java
默认方法就是向接口增长新的行为。它是一种新的方法:接口方法能够是抽象的或者是默认的。默认方法拥有默认实现,接口实现类经过继承获得该默认实现。默认方法不是抽象的,因此咱们能够放心的向函数式接口里增长默认方法,而不用担忧函数式接口单抽象方法的限制。git
public interface Iterator<E> {
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}
和其余方法同样,默认方法也能够被继承。github
除了上面看到的默认方法,Java8中还容许咱们在接口中定义静态方法。这使得咱们能够从接口中直接调用它相关的辅助方法,而不是从其它的辅助类中调用(如Collections)。在作集合中元素比较的时候,咱们通常须要使用静态辅助方法生成实现Comparator的比较器,在Java8中咱们能够直接把该静态方法定义在Comparator接口中:markdown
public static <T, U extends Comparable<? super U>>
Comparator<T> comparing(Function<T, U> keyExtractor) {
return (c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
}
若是你喜欢个人文章,就关注下个人知乎专栏或者在 GitHub 上添个 Star 吧!app