java集合之Iterable介面原始碼分析
阿新 • • 發佈:2019-01-23
Iterable 原始碼分析
Iterable簡介
Iterable是從jdk1.5就存在的介面,其實我們經常用到它的功能,就是for-each,要想使用for-each,就必須實現此介面。
API簡介
// since 1.5
Iterator<T> iterator();
// since 1.8
default void forEach(Consumer<? super T> action){}
// since 1.8
default Spliterator<T> spliterator(){}
原始碼分析
public interface Iterable <T> {
// 返回T元素型別的迭代器
Iterator<T> iterator();
// 對Iterable的每個元素執行給定操作,直到處理完所有元素或操作引發異常。
// 除非實現類另有指定,否則操作按迭代順序執行(如果指定了迭代順序)
// Consumer 四大函式介面,不在本章敘述範圍內 後續會有文章專門講解java8函式程式設計
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
// 可分割的迭代器,是1.8退出的用於並行遍歷元素而設計的一個迭代器
// 官方文件說明預設的實現分割的能力比較差,推薦覆蓋預設實現。
// 可以跟上面的Iterator功能區分;一個是順序遍歷,一個是並行遍歷
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
}
實戰演練
- Iterator 遍歷元素
String[] s = {"a", "b", "c", "d", "e"};
List<String> list = Arrays.asList(s);
Iterator<String> itr = list.iterator();
while (itr.hasNext()){
System.out.println(itr.next());
}
- 迴圈輸出字串陣列中的內容
String[] s = {"a", "b", "c", "d", "e"};
List<String> list1 = Arrays.asList(s);
// lambda表示式
list1.forEach(cc -> System.out.println(cc));
- 並行遍歷元素
String[] str = {"a", "b", "c", "d", "e"};
List<String> list = Arrays.asList(str);
Spliterator<String> s = list.spliterator();
Spliterator<String> s1 = s.trySplit();
// 返回值是a,b split 分割成兩個集合
// 一個為 a,b 一個為 c,d,e
s.forEachRemaining(System.out :: println);
s1.forEachRemaining(System.out :: println);
–
總結
- 實現了
Iterable
介面的類才能使用for-each
- 1.8新增了兩個預設實現:一個是
foreach
,一個是Spliterator
foreach
和Spliterator
一個是順序遍歷元素,一個是並行遍歷元素