You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by tn...@apache.org on 2012/07/31 21:02:54 UTC

svn commit: r1367706 - in /commons/proper/collections/trunk/src: changes/changes.xml main/java/org/apache/commons/collections/CollectionUtils.java test/java/org/apache/commons/collections/TestCollectionUtils.java

Author: tn
Date: Tue Jul 31 19:02:53 2012
New Revision: 1367706

URL: http://svn.apache.org/viewvc?rev=1367706&view=rev
Log:
[COLLECTION-383] Added overriden CollectionUtils#forAllDo method which takes an Iterator as input, thanks to Adrian Cumiskey for report and patch.

Modified:
    commons/proper/collections/trunk/src/changes/changes.xml
    commons/proper/collections/trunk/src/main/java/org/apache/commons/collections/CollectionUtils.java
    commons/proper/collections/trunk/src/test/java/org/apache/commons/collections/TestCollectionUtils.java

Modified: commons/proper/collections/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/changes/changes.xml?rev=1367706&r1=1367705&r2=1367706&view=diff
==============================================================================
--- commons/proper/collections/trunk/src/changes/changes.xml (original)
+++ commons/proper/collections/trunk/src/changes/changes.xml Tue Jul 31 19:02:53 2012
@@ -22,6 +22,9 @@
   <body>
 
   <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">
       Return concrete class in static factory methods instead of base class interface
       (except for Unmodifiable decorators).

Modified: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections/CollectionUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/main/java/org/apache/commons/collections/CollectionUtils.java?rev=1367706&r1=1367705&r2=1367706&view=diff
==============================================================================
--- commons/proper/collections/trunk/src/main/java/org/apache/commons/collections/CollectionUtils.java (original)
+++ commons/proper/collections/trunk/src/main/java/org/apache/commons/collections/CollectionUtils.java Tue Jul 31 19:02:53 2012
@@ -473,6 +473,27 @@ public class CollectionUtils {
     }
 
     /**
+     * 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
      * predicate returns false, remove the element.
      * <p>

Modified: commons/proper/collections/trunk/src/test/java/org/apache/commons/collections/TestCollectionUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/test/java/org/apache/commons/collections/TestCollectionUtils.java?rev=1367706&r1=1367705&r2=1367706&view=diff
==============================================================================
--- commons/proper/collections/trunk/src/test/java/org/apache/commons/collections/TestCollectionUtils.java (original)
+++ commons/proper/collections/trunk/src/test/java/org/apache/commons/collections/TestCollectionUtils.java Tue Jul 31 19:02:53 2012
@@ -513,8 +513,9 @@ public class TestCollectionUtils extends
         assertNull(CollectionUtils.find(collectionA, null));
     }
 
+    @SuppressWarnings({ "unchecked", "rawtypes" })
     @Test
-    public void forAllDo() {
+    public void forAllDoCollection() {
         Closure<List<? extends Number>> testClosure = ClosureUtils.invokerClosure("clear");
         Collection<List<? extends Number>> col = new ArrayList<List<? extends Number>>();
         col.add(collectionA);
@@ -522,15 +523,34 @@ public class TestCollectionUtils extends
         Closure<List<? extends Number>> resultClosure = CollectionUtils.forAllDo(col, testClosure);
         assertSame(testClosure, resultClosure);
         assertTrue(collectionA.isEmpty() && collectionB.isEmpty());
-        resultClosure = CollectionUtils.<List<? extends Number>,Closure<List<? extends Number>>>forAllDo(col, null);
+        resultClosure = CollectionUtils.forAllDo(col, null);
         assertNull(resultClosure);
         assertTrue(collectionA.isEmpty() && collectionB.isEmpty());
-        resultClosure = CollectionUtils.forAllDo(null, testClosure);
+        resultClosure = CollectionUtils.forAllDo((Collection) null, testClosure);
         col.add(null);
         // null should be OK
         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)
     public void forAllDoFailure() {
         Closure<String> testClosure = ClosureUtils.invokerClosure("clear");