1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.functor.core.collection;
18
19 import java.util.Iterator;
20 import java.util.NoSuchElementException;
21
22 import org.apache.commons.functor.UnaryPredicate;
23
24
25
26
27
28
29
30 public final class FilteredIterator<T> implements Iterator<T> {
31
32
33
34 private final UnaryPredicate<? super T> predicate;
35 private final Iterator<? extends T> iterator;
36
37 private T next = null;
38 private boolean nextSet = false;
39 private boolean canRemove = false;
40
41
42
43
44
45
46
47
48 public FilteredIterator(Iterator<? extends T> iterator, UnaryPredicate<? super T> predicate) {
49 if (null == iterator) {
50 throw new IllegalArgumentException("Iterator argument was null");
51 }
52 if (null == predicate) {
53 throw new IllegalArgumentException("filtering UnaryPredicate argument was null");
54 }
55 this.predicate = predicate;
56 this.iterator = iterator;
57 }
58
59
60
61
62
63
64
65
66 public boolean hasNext() {
67 return nextSet || setNext();
68 }
69
70
71
72
73
74 public T next() {
75 if (hasNext()) {
76 return returnNext();
77 }
78 throw new NoSuchElementException();
79 }
80
81
82
83
84
85 public void remove() {
86 if (canRemove) {
87 canRemove = false;
88 iterator.remove();
89 } else {
90 throw new IllegalStateException();
91 }
92 }
93
94
95
96
97 public boolean equals(Object obj) {
98 if (obj == this) {
99 return true;
100 }
101 if (!(obj instanceof FilteredIterator<?>)) {
102 return false;
103 }
104 FilteredIterator<?> that = (FilteredIterator<?>) obj;
105 return predicate.equals(that.predicate) && iterator.equals(that.iterator);
106 }
107
108
109
110
111 public int hashCode() {
112 int hash = "FilteredIterator".hashCode();
113 hash <<= 2;
114 hash ^= predicate.hashCode();
115 hash <<= 2;
116 hash ^= iterator.hashCode();
117 return hash;
118 }
119
120
121
122
123 public String toString() {
124 return "FilteredIterator<" + iterator + "," + predicate + ">";
125 }
126
127
128
129
130
131
132
133
134
135 @SuppressWarnings("unchecked")
136 public static <T> Iterator<T> filter(Iterator<? extends T> iter, UnaryPredicate<? super T> pred) {
137 return null == pred ? (Iterator<T>) iter : (null == iter ? null : new FilteredIterator<T>(iter, pred));
138 }
139
140
141
142
143
144
145
146 private boolean setNext() {
147 while (iterator.hasNext()) {
148 canRemove = false;
149 T obj = iterator.next();
150 if (predicate.test(obj)) {
151 nextSet = true;
152 next = obj;
153 return true;
154 }
155 }
156 next = null;
157 nextSet = false;
158 return false;
159 }
160
161
162
163
164
165 private T returnNext() {
166 T temp = next;
167 canRemove = true;
168 next = null;
169 nextSet = false;
170 return temp;
171 }
172
173 }