mirror of
https://github.com/apache/commons-collections.git
synced 2025-02-16 15:07:17 +00:00
[COLLECTION-383] Added overriden CollectionUtils#forAllDo method which takes an Iterator as input, thanks to Adrian Cumiskey for report and patch.
git-svn-id: https://svn.apache.org/repos/asf/commons/proper/collections/trunk@1367706 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
cde8c81a4e
commit
61fe60ef9d
@ -22,6 +22,9 @@
|
|||||||
<body>
|
<body>
|
||||||
|
|
||||||
<release version="4.0" date="TBA" description="Next release">
|
<release version="4.0" date="TBA" description="Next release">
|
||||||
|
<action issue="COLLECTIONS-383" dev="tn" type="add" due-to="Adrian Cumiskey">
|
||||||
|
Added "CollectionUtils#forAllDo" implementation which takes an "Iterator" as input.
|
||||||
|
</action>
|
||||||
<action issue="COLLECTIONS-231" dev="tn" type="fix" due-to="Torsten Curdt">
|
<action issue="COLLECTIONS-231" dev="tn" type="fix" due-to="Torsten Curdt">
|
||||||
Return concrete class in static factory methods instead of base class interface
|
Return concrete class in static factory methods instead of base class interface
|
||||||
(except for Unmodifiable decorators).
|
(except for Unmodifiable decorators).
|
||||||
|
@ -472,6 +472,27 @@ public class CollectionUtils {
|
|||||||
return closure;
|
return closure;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Executes the given closure on each element in the collection.
|
||||||
|
* <p>
|
||||||
|
* If the input collection or closure is null, there is no change made.
|
||||||
|
*
|
||||||
|
* @param iterator
|
||||||
|
* the iterator to get the input from, may be null
|
||||||
|
* @param closure
|
||||||
|
* the closure to perform, may be null
|
||||||
|
* @return closure
|
||||||
|
* @since 4.0
|
||||||
|
*/
|
||||||
|
public static <T, C extends Closure<? super T>> C forAllDo(Iterator<T> iterator, C closure) {
|
||||||
|
if (iterator != null && closure != null) {
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
closure.execute(iterator.next());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return closure;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Filter the collection by applying a Predicate to each element. If the
|
* Filter the collection by applying a Predicate to each element. If the
|
||||||
* predicate returns false, remove the element.
|
* predicate returns false, remove the element.
|
||||||
|
@ -513,8 +513,9 @@ public class TestCollectionUtils extends MockTestCase {
|
|||||||
assertNull(CollectionUtils.find(collectionA, null));
|
assertNull(CollectionUtils.find(collectionA, null));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||||
@Test
|
@Test
|
||||||
public void forAllDo() {
|
public void forAllDoCollection() {
|
||||||
Closure<List<? extends Number>> testClosure = ClosureUtils.invokerClosure("clear");
|
Closure<List<? extends Number>> testClosure = ClosureUtils.invokerClosure("clear");
|
||||||
Collection<List<? extends Number>> col = new ArrayList<List<? extends Number>>();
|
Collection<List<? extends Number>> col = new ArrayList<List<? extends Number>>();
|
||||||
col.add(collectionA);
|
col.add(collectionA);
|
||||||
@ -522,15 +523,34 @@ public class TestCollectionUtils extends MockTestCase {
|
|||||||
Closure<List<? extends Number>> resultClosure = CollectionUtils.forAllDo(col, testClosure);
|
Closure<List<? extends Number>> resultClosure = CollectionUtils.forAllDo(col, testClosure);
|
||||||
assertSame(testClosure, resultClosure);
|
assertSame(testClosure, resultClosure);
|
||||||
assertTrue(collectionA.isEmpty() && collectionB.isEmpty());
|
assertTrue(collectionA.isEmpty() && collectionB.isEmpty());
|
||||||
resultClosure = CollectionUtils.<List<? extends Number>,Closure<List<? extends Number>>>forAllDo(col, null);
|
resultClosure = CollectionUtils.forAllDo(col, null);
|
||||||
assertNull(resultClosure);
|
assertNull(resultClosure);
|
||||||
assertTrue(collectionA.isEmpty() && collectionB.isEmpty());
|
assertTrue(collectionA.isEmpty() && collectionB.isEmpty());
|
||||||
resultClosure = CollectionUtils.forAllDo(null, testClosure);
|
resultClosure = CollectionUtils.forAllDo((Collection) null, testClosure);
|
||||||
col.add(null);
|
col.add(null);
|
||||||
// null should be OK
|
// null should be OK
|
||||||
CollectionUtils.forAllDo(col, testClosure);
|
CollectionUtils.forAllDo(col, testClosure);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||||
|
@Test
|
||||||
|
public void forAllDoIterator() {
|
||||||
|
Closure<List<? extends Number>> testClosure = ClosureUtils.invokerClosure("clear");
|
||||||
|
Collection<List<? extends Number>> col = new ArrayList<List<? extends Number>>();
|
||||||
|
col.add(collectionA);
|
||||||
|
col.add(collectionB);
|
||||||
|
Closure<List<? extends Number>> resultClosure = CollectionUtils.forAllDo(col.iterator(), testClosure);
|
||||||
|
assertSame(testClosure, resultClosure);
|
||||||
|
assertTrue(collectionA.isEmpty() && collectionB.isEmpty());
|
||||||
|
resultClosure = CollectionUtils.forAllDo(col.iterator(), null);
|
||||||
|
assertNull(resultClosure);
|
||||||
|
assertTrue(collectionA.isEmpty() && collectionB.isEmpty());
|
||||||
|
resultClosure = CollectionUtils.forAllDo((Iterator) null, testClosure);
|
||||||
|
col.add(null);
|
||||||
|
// null should be OK
|
||||||
|
CollectionUtils.forAllDo(col.iterator(), testClosure);
|
||||||
|
}
|
||||||
|
|
||||||
@Test(expected = FunctorException.class)
|
@Test(expected = FunctorException.class)
|
||||||
public void forAllDoFailure() {
|
public void forAllDoFailure() {
|
||||||
Closure<String> testClosure = ClosureUtils.invokerClosure("clear");
|
Closure<String> testClosure = ClosureUtils.invokerClosure("clear");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user