來看最后一組 – Iterator。
LoopingIterator
ArrayListIterator
FilterIterator
UniqueFilterIterator
IteratorUtils
java.util.Iterator接口定義了標準的Collection遍歷方法,但是如果不做改變的使用它,我們得到的是從頭到尾一次性的遍歷。假如我們需要循環遍歷,假如我們需要遍歷某一段,假如我們需要遍歷滿足某些條件的元素,等等等等,我們就不能完全依賴于這個Iterator的標準實現了。除非我們寧可在此基礎上在調用的代碼中多加一些判斷,不過這樣的話代碼就會顯得混亂,時間長了就容易變得難以維護。Commons Collections的這一組Iterator為我們帶來了便利。
這些Iterator使用都很一目了然,直接看例子吧:
package sean.study.commons.collections;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.collections.Predicate;
import org.apache.commons.collections.iterators.ArrayListIterator;
import org.apache.commons.collections.iterators.FilterIterator;
import org.apache.commons.collections.iterators.LoopingIterator;
import org.apache.commons.lang.StringUtils;
public class IteratorUsage {
public static void main(String[] args) {
demoIteratorUsage();
}
public static void demoIteratorUsage() {
System.out.println(StringUtils.center(" demoClosureUsage ", 40, "="));
// data setup
String[] weekDays = {
"Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sunday"
};
List weekDayList = Arrays.asList(weekDays);
// workdays
Iterator iter1 = new ArrayListIterator(weekDays, 0, 5);
printColl("Partial:", iter1, 5);
// loop
Iterator iter2 = new LoopingIterator(weekDayList);
printColl("Loop:", iter2, 10);
// looping workdays
Predicate notWeekendPredicate = new Predicate() {
public boolean evaluate(Object obj) {
String str = (String) obj;
if ("Saturday".equalsIgnoreCase(str)) {
return false;
}
if ("Sunday".equalsIgnoreCase(str)) {
return false;
}
return true;
}
};
Iterator iter3 = new FilterIterator(
new LoopingIterator(weekDayList),
notWeekendPredicate
);
printColl("No Weekends loop:", iter3, 12);
System.out.println(StringUtils.repeat("=", 40));
}
public static void printColl(String label, Iterator iter, int maxCount) {
if (StringUtils.isNotBlank(label)) {
System.out.println(label);
}
int i = 0;
while (iter.hasNext() && i < maxCount) {
System.out.println("# " + iter.next() + " #");
i++;
}
}
}
運行結果如下:
=========== demoClosureUsage ===========
Partial:
# Monday #
# Tuesday #
# Wednesday #
# Thursday #
# Friday #
Loop:
# Monday #
# Tuesday #
# Wednesday #
# Thursday #
# Friday #
# Saturday #
# Sunday #
# Monday #
# Tuesday #
# Wednesday #
No Weekends loop:
# Monday #
# Tuesday #
# Wednesday #
# Thursday #
# Friday #
# Monday #
# Tuesday #
# Wednesday #
# Thursday #
# Friday #
# Monday #
# Tuesday #
========================================
有了這些實用的Iterator類,我們就可以輕松的實現可配置的遍歷行為了。