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 2016/05/25 03:20:22 UTC

svn commit: r1683894 - in /commons/proper/collections/trunk/src: changes/ main/java/org/apache/commons/collections4/ test/java/org/apache/commons/collections4/

Author: tn
Date: Sat Jun  6 08:54:54 2015
New Revision: 1683894

URL: http://svn.apache.org/viewvc?rev=1683894&view=rev
Log:
[COLLECTIONS-551] Move partition methods from CollectionUtils to IterableUtils. Make method consistent: do not allow null predicates, return the same for a null iterable as for an empty one.

Modified:
    commons/proper/collections/trunk/src/changes/changes.xml
    commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/CollectionUtils.java
    commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/IterableUtils.java
    commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/CollectionUtilsTest.java
    commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/IterableUtilsTest.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=1683894&r1=1683893&r2=1683894&view=diff
==============================================================================
--- commons/proper/collections/trunk/src/changes/changes.xml (original)
+++ commons/proper/collections/trunk/src/changes/changes.xml Sat Jun  6 08:54:54 2015
@@ -98,7 +98,7 @@
       that are prefixed by the given search key in some rare cases.
     </action>
     <action issue="COLLECTIONS-511" dev="tn" type="add" due-to="Nathan Blomquist, Brent Worden">
-      Added new methods "CollectionUtils#partition(...)" to partition an input collection
+      Added new methods "IterableUtils#partition(...)" to partition an input collection
       into separate output collections based on evaluation of one or more predicates.
     </action>
     <action issue="COLLECTIONS-537" dev="tn" type="fix" due-to="Frank Jakop">

Modified: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/CollectionUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/CollectionUtils.java?rev=1683894&r1=1683893&r2=1683894&view=diff
==============================================================================
--- commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/CollectionUtils.java (original)
+++ commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/CollectionUtils.java Sat Jun  6 08:54:54 2015
@@ -19,7 +19,6 @@ package org.apache.commons.collections4;
 import java.lang.reflect.Array;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Comparator;
 import java.util.Enumeration;
 import java.util.HashMap;
@@ -919,93 +918,7 @@ public class CollectionUtils {
     }
 
     /**
-     * Selects all elements from inputCollection which don't match the given
-     * predicate into an output collection.
-     * <p>
-     * If the input predicate is <code>null</code>, the result is an empty
-     * list.
-     *
-     * @param <O>  the type of object the {@link Iterable} contains
-     * @param inputCollection  the collection to get the input from, may not be null
-     * @param predicate  the predicate to use, may be null
-     * @return the elements <b>not</b> matching the predicate (new list)
-     * @throws NullPointerException if the input collection is null
-     */
-    public static <O> Collection<O> selectRejected(final Iterable<? extends O> inputCollection,
-                                                   final Predicate<? super O> predicate) {
-        final Collection<O> answer = inputCollection instanceof Collection<?> ?
-                new ArrayList<O>(((Collection<?>) inputCollection).size()) : new ArrayList<O>();
-        return selectRejected(inputCollection, predicate, answer);
-    }
-
-    /**
-     * Selects all elements from inputCollection which don't match the given
-     * predicate and adds them to outputCollection.
-     * <p>
-     * If the input predicate is <code>null</code>, no elements are added to
-     * <code>outputCollection</code>.
-     *
-     * @param <O>  the type of object the {@link Iterable} contains
-     * @param <R>  the type of the output {@link Collection}
-     * @param inputCollection  the collection to get the input from, may be null
-     * @param predicate  the predicate to use, may be null
-     * @param outputCollection  the collection to output into, may not be null if the inputCollection
-     *   and predicate or not null
-     * @return outputCollection
-     */
-    public static <O, R extends Collection<? super O>> R selectRejected(final Iterable<? extends O> inputCollection,
-            final Predicate<? super O> predicate, final R outputCollection) {
-
-        if (inputCollection != null && predicate != null) {
-            for (final O item : inputCollection) {
-                if (!predicate.evaluate(item)) {
-                    outputCollection.add(item);
-                }
-            }
-        }
-        return outputCollection;
-    }
-
-    /**
-     * Partitions all elements from inputCollection into separate output collections,
-     * based on the evaluation of the given predicate.
-     * <p>
-     * For each predicate, the result will contain a list holding all elements of the
-     * input collection matching the predicate. The last list will hold all elements
-     * which didn't match any predicate:
-     * <pre>
-     *  [C1, R] = partition(I, P1) with
-     *  I = input collection
-     *  P1 = first predicate
-     *  C1 = collection of elements matching P1
-     *  R = collection of elements rejected by all predicates
-     * </pre>
-     * <p>
-     * If the input collection is <code>null</code>, an empty list will be returned.
-     * If the input predicate is <code>null</code>, all elements of the input collection
-     * will be added to the rejected collection.
-     * <p>
-     * Example: for an input list [1, 2, 3, 4, 5] calling partition with a predicate [x &lt; 3]
-     * will result in the following output: [[1, 2], [3, 4, 5]].
-     *
-     * @param <O>  the type of object the {@link Iterable} contains
-     * @param inputCollection  the collection to get the input from, may be null
-     * @param predicate  the predicate to use, may be null
-     * @return a list containing the output collections
-     * @since 4.1
-     */
-    public static <O> List<List<O>> partition(final Iterable<? extends O> inputCollection,
-                                              final Predicate<? super O> predicate) {
-
-        @SuppressWarnings({ "unchecked", "rawtypes" }) // safe
-        final Factory<List<O>> factory = FactoryUtils.instantiateFactory((Class) ArrayList.class);
-        @SuppressWarnings("unchecked") // safe
-        final Predicate<? super O>[] predicates = new Predicate[] { predicate };
-        return partition(inputCollection, factory, predicates);
-    }
-
-    /**
-     * Partitions all elements from inputCollection into an output and rejected collection,
+     * Selects all elements from inputCollection into an output and rejected collection,
      * based on the evaluation of the given predicate.
      * <p>
      * Elements matching the predicate are added to the <code>outputCollection</code>,
@@ -1028,9 +941,10 @@ public class CollectionUtils {
      *   inputCollection and predicate are not null
      * @param rejectedCollection  the collection to output rejected elements into, may not be null if the
      *   inputCollection or predicate are not null
+     * @return the outputCollection
      * @since 4.1
      */
-    public static <O, R extends Collection<? super O>> void partition(final Iterable<? extends O> inputCollection,
+    public static <O, R extends Collection<? super O>> R select(final Iterable<? extends O> inputCollection,
             final Predicate<? super O> predicate, R outputCollection, R rejectedCollection) {
 
         if (inputCollection != null && predicate != null) {
@@ -1042,128 +956,55 @@ public class CollectionUtils {
                 }
             }
         }
+        return outputCollection;
     }
 
     /**
-     * Partitions all elements from inputCollection into separate output collections,
-     * based on the evaluation of the given predicates.
-     * <p>
-     * For each predicate, the result will contain a list holding all elements of the
-     * input collection matching the predicate. The last list will hold all elements
-     * which didn't match any predicate:
-     * <pre>
-     *  [C1, C2, R] = partition(I, P1, P2) with
-     *  I = input collection
-     *  P1 = first predicate
-     *  P2 = second predicate
-     *  C1 = collection of elements matching P1
-     *  C2 = collection of elements matching P2
-     *  R = collection of elements rejected by all predicates
-     * </pre>
-     * <p>
-     * <b>Note</b>: elements are only added to the output collection of the first matching
-     * predicate, determined by the order of arguments.
-     * <p>
-     * If the input collection is <code>null</code>, an empty list will be returned.
-     * If the input predicate is <code>null</code>, all elements of the input collection
-     * will be added to the rejected collection.
+     * Selects all elements from inputCollection which don't match the given
+     * predicate into an output collection.
      * <p>
-     * Example: for an input list [1, 2, 3, 4, 5] calling partition with predicates [x &lt; 3]
-     * and [x &lt; 5] will result in the following output: [[1, 2], [3, 4], [5]].
+     * If the input predicate is <code>null</code>, the result is an empty
+     * list.
      *
      * @param <O>  the type of object the {@link Iterable} contains
-     * @param inputCollection  the collection to get the input from, may be null
-     * @param predicates  the predicates to use, may be null
-     * @return a list containing the output collections
-     * @since 4.1
+     * @param inputCollection  the collection to get the input from, may not be null
+     * @param predicate  the predicate to use, may be null
+     * @return the elements <b>not</b> matching the predicate (new list)
+     * @throws NullPointerException if the input collection is null
      */
-    public static <O> List<List<O>> partition(final Iterable<? extends O> inputCollection,
-                                              final Predicate<? super O>... predicates) {
-
-        @SuppressWarnings({ "unchecked", "rawtypes" }) // safe
-        final Factory<List<O>> factory = FactoryUtils.instantiateFactory((Class) ArrayList.class);
-        return partition(inputCollection, factory, predicates);
+    public static <O> Collection<O> selectRejected(final Iterable<? extends O> inputCollection,
+                                                   final Predicate<? super O> predicate) {
+        final Collection<O> answer = inputCollection instanceof Collection<?> ?
+                new ArrayList<O>(((Collection<?>) inputCollection).size()) : new ArrayList<O>();
+        return selectRejected(inputCollection, predicate, answer);
     }
 
     /**
-     * Partitions all elements from inputCollection into separate output collections,
-     * based on the evaluation of the given predicates.
-     * <p>
-     * For each predicate, the returned list will contain a collection holding
-     * all elements of the input collection matching the predicate. The last collection
-     * contained in the list will hold all elements which didn't match any predicate:
-     * <pre>
-     *  [C1, C2, R] = partition(I, P1, P2) with
-     *  I = input collection
-     *  P1 = first predicate
-     *  P2 = second predicate
-     *  C1 = collection of elements matching P1
-     *  C2 = collection of elements matching P2
-     *  R = collection of elements rejected by all predicates
-     * </pre>
-     * <p>
-     * <b>Note</b>: elements are only added to the output collection of the first matching
-     * predicate, determined by the order of arguments.
-     * <p>
-     * If the input collection is <code>null</code>, an empty list will be returned.
-     * If no predicates have been provided, all elements of the input collection
-     * will be added to the rejected collection.
+     * Selects all elements from inputCollection which don't match the given
+     * predicate and adds them to outputCollection.
      * <p>
-     * Example: for an input list [1, 2, 3, 4, 5] calling partition with predicates [x &lt; 3]
-     * and [x &lt; 5] will result in the following output: [[1, 2], [3, 4], [5]].
+     * If the input predicate is <code>null</code>, no elements are added to
+     * <code>outputCollection</code>.
      *
      * @param <O>  the type of object the {@link Iterable} contains
      * @param <R>  the type of the output {@link Collection}
      * @param inputCollection  the collection to get the input from, may be null
-     * @param partitionFactory  the factory used to create the output collections
-     * @param predicates  the predicates to use, may be empty
-     * @return a list containing the output collections
-     * @since 4.1
+     * @param predicate  the predicate to use, may be null
+     * @param outputCollection  the collection to output into, may not be null if the inputCollection
+     *   and predicate or not null
+     * @return outputCollection
      */
-    public static <O, R extends Collection<O>> List<R> partition(final Iterable<? extends O> inputCollection,
-            final Factory<R> partitionFactory, final Predicate<? super O>... predicates) {
-
-        if (inputCollection == null) {
-            return Collections.emptyList();
-        }
+    public static <O, R extends Collection<? super O>> R selectRejected(final Iterable<? extends O> inputCollection,
+            final Predicate<? super O> predicate, final R outputCollection) {
 
-        if (predicates == null || predicates.length < 1) {
-            // return the entire input collection as a single partition
-            final R singlePartition = partitionFactory.create();
-            select(inputCollection, PredicateUtils.truePredicate(), singlePartition);
-            return Collections.singletonList(singlePartition);
-        }
-
-        // create the empty partitions
-        final int numberOfPredicates = predicates.length;
-        final int numberOfPartitions = numberOfPredicates + 1;
-        final List<R> partitions = new ArrayList<R>(numberOfPartitions);
-        for (int i = 0; i < numberOfPartitions; ++i) {
-            partitions.add(partitionFactory.create());
-        }
-
-        // for each element in inputCollection:
-        // find the first predicate that evaluates to true.
-        // if there is a predicate, add the element to the corresponding partition.
-        // if there is no predicate, add it to the last, catch-all partition.
-        for (final O element : inputCollection) {
-            boolean elementAssigned = false;
-            for (int i = 0; i < numberOfPredicates; ++i) {
-                if (predicates[i].evaluate(element)) {
-                    partitions.get(i).add(element);
-                    elementAssigned = true;
-                    break;
+        if (inputCollection != null && predicate != null) {
+            for (final O item : inputCollection) {
+                if (!predicate.evaluate(item)) {
+                    outputCollection.add(item);
                 }
             }
-
-            if (!elementAssigned) {
-                // no predicates evaluated to true
-                // add element to last partition
-                partitions.get(numberOfPredicates).add(element);
-            }
         }
-
-        return partitions;
+        return outputCollection;
     }
 
     /**

Modified: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/IterableUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/IterableUtils.java?rev=1683894&r1=1683893&r2=1683894&view=diff
==============================================================================
--- commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/IterableUtils.java (original)
+++ commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/IterableUtils.java Sat Jun  6 08:54:54 2015
@@ -16,7 +16,9 @@
  */
 package org.apache.commons.collections4;
 
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
@@ -681,6 +683,178 @@ public class IterableUtils {
     }
 
     /**
+     * Partitions all elements from iterable into separate output collections,
+     * based on the evaluation of the given predicate.
+     * <p>
+     * For each predicate, the result will contain a list holding all elements of the
+     * input iterable matching the predicate. The last list will hold all elements
+     * which didn't match any predicate:
+     * <pre>
+     *  [C1, R] = partition(I, P1) with
+     *  I = input
+     *  P1 = first predicate
+     *  C1 = collection of elements matching P1
+     *  R = collection of elements rejected by all predicates
+     * </pre>
+     * <p>
+     * If the input iterable is <code>null</code>, the same is returned as for an
+     * empty iterable.
+     * <p>
+     * Example: for an input list [1, 2, 3, 4, 5] calling partition with a predicate [x &lt; 3]
+     * will result in the following output: [[1, 2], [3, 4, 5]].
+     *
+     * @param <O>  the type of object the {@link Iterable} contains
+     * @param iterable  the iterable to partition, may be null
+     * @param predicate  the predicate to use, may not be null
+     * @return a list containing the output collections
+     * @throws NullPointerException if predicate is null
+     */
+    public static <O> List<List<O>> partition(final Iterable<? extends O> iterable,
+                                              final Predicate<? super O> predicate) {
+        if (predicate == null) {
+            throw new NullPointerException("Predicate must not be null.");
+        }
+        @SuppressWarnings({ "unchecked", "rawtypes" }) // safe
+        final Factory<List<O>> factory = FactoryUtils.instantiateFactory((Class) ArrayList.class);
+        @SuppressWarnings("unchecked") // safe
+        final Predicate<? super O>[] predicates = new Predicate[] { predicate };
+        return partition(iterable, factory, predicates);
+    }
+
+    /**
+     * Partitions all elements from iterable into separate output collections,
+     * based on the evaluation of the given predicates.
+     * <p>
+     * For each predicate, the result will contain a list holding all elements of the
+     * input iterable matching the predicate. The last list will hold all elements
+     * which didn't match any predicate:
+     * <pre>
+     *  [C1, C2, R] = partition(I, P1, P2) with
+     *  I = input
+     *  P1 = first predicate
+     *  P2 = second predicate
+     *  C1 = collection of elements matching P1
+     *  C2 = collection of elements matching P2
+     *  R = collection of elements rejected by all predicates
+     * </pre>
+     * <p>
+     * <b>Note</b>: elements are only added to the output collection of the first matching
+     * predicate, determined by the order of arguments.
+     * <p>
+     * If the input iterable is <code>null</code>, the same is returned as for an
+     * empty iterable.
+     * <p>
+     * Example: for an input list [1, 2, 3, 4, 5] calling partition with predicates [x &lt; 3]
+     * and [x &lt; 5] will result in the following output: [[1, 2], [3, 4], [5]].
+     *
+     * @param <O>  the type of object the {@link Iterable} contains
+     * @param iterable  the collection to get the input from, may be null
+     * @param predicates  the predicates to use, may not be null
+     * @return a list containing the output collections
+     * @throws NullPointerException if any predicate is null
+     */
+    public static <O> List<List<O>> partition(final Iterable<? extends O> iterable,
+                                              final Predicate<? super O>... predicates) {
+
+        @SuppressWarnings({ "unchecked", "rawtypes" }) // safe
+        final Factory<List<O>> factory = FactoryUtils.instantiateFactory((Class) ArrayList.class);
+        return partition(iterable, factory, predicates);
+    }
+
+    /**
+     * Partitions all elements from iterable into separate output collections,
+     * based on the evaluation of the given predicates.
+     * <p>
+     * For each predicate, the returned list will contain a collection holding
+     * all elements of the input iterable matching the predicate. The last collection
+     * contained in the list will hold all elements which didn't match any predicate:
+     * <pre>
+     *  [C1, C2, R] = partition(I, P1, P2) with
+     *  I = input
+     *  P1 = first predicate
+     *  P2 = second predicate
+     *  C1 = collection of elements matching P1
+     *  C2 = collection of elements matching P2
+     *  R = collection of elements rejected by all predicates
+     * </pre>
+     * <p>
+     * <b>Note</b>: elements are only added to the output collection of the first matching
+     * predicate, determined by the order of arguments.
+     * <p>
+     * If the input iterable is <code>null</code>, the same is returned as for an
+     * empty iterable.
+     * If no predicates have been provided, all elements of the input collection
+     * will be added to the rejected collection.
+     * <p>
+     * Example: for an input list [1, 2, 3, 4, 5] calling partition with predicates [x &lt; 3]
+     * and [x &lt; 5] will result in the following output: [[1, 2], [3, 4], [5]].
+     *
+     * @param <O>  the type of object the {@link Iterable} contains
+     * @param <R>  the type of the output {@link Collection}
+     * @param iterable  the collection to get the input from, may be null
+     * @param partitionFactory  the factory used to create the output collections
+     * @param predicates  the predicates to use, may not be null
+     * @return a list containing the output collections
+     * @throws NullPointerException if any predicate is null
+     */
+    public static <O, R extends Collection<O>> List<R> partition(final Iterable<? extends O> iterable,
+            final Factory<R> partitionFactory, final Predicate<? super O>... predicates) {
+
+        if (iterable == null) {
+            final Iterable<O> empty = emptyIterable();
+            return partition(empty, partitionFactory, predicates);
+        }
+
+        if (predicates == null) {
+            throw new NullPointerException("Predicates must not be null.");
+        }
+
+        for (Predicate<?> p : predicates) {
+            if (p == null) {
+                throw new NullPointerException("Predicate must not be null.");
+            }
+        }
+
+        if (predicates.length < 1) {
+            // return the entire input collection as a single partition
+            final R singlePartition = partitionFactory.create();
+            CollectionUtils.addAll(singlePartition, iterable);
+            return Collections.singletonList(singlePartition);
+        }
+
+        // create the empty partitions
+        final int numberOfPredicates = predicates.length;
+        final int numberOfPartitions = numberOfPredicates + 1;
+        final List<R> partitions = new ArrayList<R>(numberOfPartitions);
+        for (int i = 0; i < numberOfPartitions; ++i) {
+            partitions.add(partitionFactory.create());
+        }
+
+        // for each element in inputCollection:
+        // find the first predicate that evaluates to true.
+        // if there is a predicate, add the element to the corresponding partition.
+        // if there is no predicate, add it to the last, catch-all partition.
+        for (final O element : iterable) {
+            boolean elementAssigned = false;
+            for (int i = 0; i < numberOfPredicates; ++i) {
+                if (predicates[i].evaluate(element)) {
+                    partitions.get(i).add(element);
+                    elementAssigned = true;
+                    break;
+                }
+            }
+
+            if (!elementAssigned) {
+                // no predicates evaluated to true
+                // add element to last partition
+                partitions.get(numberOfPredicates).add(element);
+            }
+        }
+
+        return partitions;
+    }
+
+    /**
      * Gets a new list with the contents of the provided iterable.
      *
      * @param <E>  the element type

Modified: commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/CollectionUtilsTest.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/CollectionUtilsTest.java?rev=1683894&r1=1683893&r2=1683894&view=diff
==============================================================================
--- commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/CollectionUtilsTest.java (original)
+++ commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/CollectionUtilsTest.java Sat Jun  6 08:54:54 2015
@@ -1070,12 +1070,6 @@ public class CollectionUtilsTest extends
         }
     };
 
-    private static Predicate<Number> EVEN = new Predicate<Number>() {
-        public boolean evaluate(final Number input) {
-            return input.intValue() % 2 == 0;
-        }
-    };
-
 //Up to here
     @Test
     public void filter() {
@@ -1171,55 +1165,7 @@ public class CollectionUtilsTest extends
     }
 
     @Test
-    public void selectRejected() {
-        final List<Long> list = new ArrayList<Long>();
-        list.add(1L);
-        list.add(2L);
-        list.add(3L);
-        list.add(4L);
-        final Collection<Long> output1 = CollectionUtils.selectRejected(list, EQUALS_TWO);
-        final Collection<? extends Number> output2 = CollectionUtils.selectRejected(list, EQUALS_TWO);
-        final HashSet<Number> output3 = CollectionUtils.selectRejected(list, EQUALS_TWO, new HashSet<Number>());
-        assertTrue(CollectionUtils.isEqualCollection(output1, output2));
-        assertTrue(CollectionUtils.isEqualCollection(output1, output3));
-        assertEquals(4, list.size());
-        assertEquals(3, output1.size());
-        assertTrue(output1.contains(1L));
-        assertTrue(output1.contains(3L));
-        assertTrue(output1.contains(4L));
-    }
-
-    @SuppressWarnings("unchecked")
-    @Test
-    public void partition() {
-        List<Integer> input = new ArrayList<Integer>();
-        input.add(1);
-        input.add(2);
-        input.add(3);
-        input.add(4);
-        List<List<Integer>> partitions = CollectionUtils.partition(input, EQUALS_TWO);
-        assertEquals(2, partitions.size());
-        
-        // first partition contains 2
-        Collection<Integer> partition = partitions.get(0);
-        assertEquals(1, partition.size());
-        assertEquals(2, CollectionUtils.extractSingleton(partition).intValue());
-        
-        // second partition contains 1, 3, and 4
-        Integer[] expected = {1, 3, 4};
-        partition = partitions.get(1);
-        Assert.assertArrayEquals(expected, partition.toArray());
-        
-        partitions = CollectionUtils.partition((List<Integer>) null, EQUALS_TWO);
-        assertTrue(partitions.isEmpty());
-        
-        partitions = CollectionUtils.partition(input);
-        assertEquals(1, partitions.size());
-        assertEquals(input, partitions.get(0));
-    }
-
-    @Test
-    public void partitionWithOutputCollections() {
+    public void selectWithOutputCollections() {
         List<Integer> input = new ArrayList<Integer>();
         input.add(1);
         input.add(2);
@@ -1229,7 +1175,7 @@ public class CollectionUtilsTest extends
         List<Integer> output = new ArrayList<Integer>();
         List<Integer> rejected = new ArrayList<Integer>();
 
-        CollectionUtils.partition(input, EQUALS_TWO, output, rejected);
+        CollectionUtils.select(input, EQUALS_TWO, output, rejected);
 
         // output contains 2
         assertEquals(1, output.size());
@@ -1241,37 +1187,30 @@ public class CollectionUtilsTest extends
         
         output.clear();
         rejected.clear();
-        CollectionUtils.partition((List<Integer>) null, EQUALS_TWO, output, rejected);
+        CollectionUtils.select((List<Integer>) null, EQUALS_TWO, output, rejected);
         assertTrue(output.isEmpty());
         assertTrue(rejected.isEmpty());
     }
 
     @Test
-    public void partitionMultiplePredicates() {
-        List<Integer> input = new ArrayList<Integer>();
-        input.add(1);
-        input.add(2);
-        input.add(3);
-        input.add(4);
-        @SuppressWarnings("unchecked")
-        List<List<Integer>> partitions = CollectionUtils.partition(input, EQUALS_TWO, EVEN);
-
-        // first partition contains 2
-        Collection<Integer> partition = partitions.get(0);
-        assertEquals(1, partition.size());
-        assertEquals(2, partition.iterator().next().intValue());
-        
-        // second partition contains 4
-        partition = partitions.get(1);
-        assertEquals(1, partition.size());
-        assertEquals(4, partition.iterator().next().intValue());
-        
-        // third partition contains 1 and 3
-        Integer[] expected = {1, 3};
-        partition = partitions.get(2);
-        Assert.assertArrayEquals(expected, partition.toArray());
+    public void selectRejected() {
+        final List<Long> list = new ArrayList<Long>();
+        list.add(1L);
+        list.add(2L);
+        list.add(3L);
+        list.add(4L);
+        final Collection<Long> output1 = CollectionUtils.selectRejected(list, EQUALS_TWO);
+        final Collection<? extends Number> output2 = CollectionUtils.selectRejected(list, EQUALS_TWO);
+        final HashSet<Number> output3 = CollectionUtils.selectRejected(list, EQUALS_TWO, new HashSet<Number>());
+        assertTrue(CollectionUtils.isEqualCollection(output1, output2));
+        assertTrue(CollectionUtils.isEqualCollection(output1, output3));
+        assertEquals(4, list.size());
+        assertEquals(3, output1.size());
+        assertTrue(output1.contains(1L));
+        assertTrue(output1.contains(3L));
+        assertTrue(output1.contains(4L));
     }
-    
+
     @Test
     public void collect() {
         final Transformer<Number, Long> transformer = TransformerUtils.constantTransformer(2L);

Modified: commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/IterableUtilsTest.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/IterableUtilsTest.java?rev=1683894&r1=1683893&r2=1683894&view=diff
==============================================================================
--- commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/IterableUtilsTest.java (original)
+++ commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/IterableUtilsTest.java Sat Jun  6 08:54:54 2015
@@ -26,6 +26,7 @@ import java.util.LinkedList;
 import java.util.List;
 
 import org.apache.commons.collections4.bag.HashBag;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -89,6 +90,12 @@ public class IterableUtilsTest {
         }
     };
 
+    private static Predicate<Number> EVEN = new Predicate<Number>() {
+        public boolean evaluate(final Number input) {
+            return input.intValue() % 2 == 0;
+        }
+    };
+
     // -----------------------------------------------------------------------
     @Test
     public void apply() {
@@ -269,6 +276,76 @@ public class IterableUtilsTest {
         IterableUtils.get(bag, 1);
     }
 
+    @SuppressWarnings("unchecked")
+    @Test
+    public void partition() {
+        List<Integer> input = new ArrayList<Integer>();
+        input.add(1);
+        input.add(2);
+        input.add(3);
+        input.add(4);
+        List<List<Integer>> partitions = IterableUtils.partition(input, EQUALS_TWO);
+        assertEquals(2, partitions.size());
+        
+        // first partition contains 2
+        Collection<Integer> partition = partitions.get(0);
+        assertEquals(1, partition.size());
+        assertEquals(2, CollectionUtils.extractSingleton(partition).intValue());
+        
+        // second partition contains 1, 3, and 4
+        Integer[] expected = {1, 3, 4};
+        partition = partitions.get(1);
+        Assert.assertArrayEquals(expected, partition.toArray());
+        
+        partitions = IterableUtils.partition((List<Integer>) null, EQUALS_TWO);
+        assertEquals(2, partitions.size());
+        assertTrue(partitions.get(0).isEmpty());
+        assertTrue(partitions.get(1).isEmpty());
+
+        partitions = IterableUtils.partition(input);
+        assertEquals(1, partitions.size());
+        assertEquals(input, partitions.get(0));
+
+        try {
+            IterableUtils.partition(input, (Predicate<Integer>) null);
+            fail("expecting NullPointerException");
+        } catch (NullPointerException npe) {
+            // expected
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void partitionMultiplePredicates() {
+        List<Integer> input = new ArrayList<Integer>();
+        input.add(1);
+        input.add(2);
+        input.add(3);
+        input.add(4);
+        List<List<Integer>> partitions = IterableUtils.partition(input, EQUALS_TWO, EVEN);
+
+        // first partition contains 2
+        Collection<Integer> partition = partitions.get(0);
+        assertEquals(1, partition.size());
+        assertEquals(2, partition.iterator().next().intValue());
+        
+        // second partition contains 4
+        partition = partitions.get(1);
+        assertEquals(1, partition.size());
+        assertEquals(4, partition.iterator().next().intValue());
+        
+        // third partition contains 1 and 3
+        Integer[] expected = {1, 3};
+        partition = partitions.get(2);
+        Assert.assertArrayEquals(expected, partition.toArray());
+
+        try {
+            IterableUtils.partition(input, EQUALS_TWO, null);
+        } catch (NullPointerException npe) {
+            // expected
+        }
+    }
+    
     @Test
     public void testToString() {
         String result = IterableUtils.toString(iterableA);