1. 程式人生 > >java集合之Iterable介面原始碼分析

java集合之Iterable介面原始碼分析

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);

總結

  1. 實現了Iterable介面的類才能使用for-each
  2. 1.8新增了兩個預設實現:一個是foreach,一個是Spliterator
  3. foreachSpliterator一個是順序遍歷元素,一個是並行遍歷元素