案例分析
- 在java8中在對list循環的時候,我們可以使用forEach這個方法對list進行遍歷,具體代碼如下demo所示
public static void main(String[] args) {
List<String> stringList = new ArrayList<String>();
stringList.forEach(s -> System.out.println(s));
}
- 我們將forEach方法點進去看一下實現類,如下所示:
public interface Iterable<T> {
Iterator<T> iterator();
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
}
- 然后我們驚奇的發現forEach的實現竟然在Iterable接口中,其實現的格式也是與其他實現類不同。
默認方法
- 關鍵字: default 在接口中方法前面加上修飾符default 編譯器就會認為該方法並非抽象方法,可以在接口中寫實現。
設計的思想
- 其實想一下我們就知道了,java8的改動目前為止可以說改動最大的一個版本,新版本的改動的原則是要兼容老版本的功能,所以這個默認方法自然而然的被提了出來,在接口上新增一個實現,不影響其他的抽象方法,接口的子類也不用去實現(或者實現都一樣) 該方法同時也可以使用該方法。是不是很巧妙。
實際項目中的使用
- 我們在實際項目中,如果不方便在老的代碼上添加新的抽象方法,或者子類的實現其實都一樣,可以在接口上直接添加默認方法,子類也擁有該方法的功能。