This is an automated email from the ASF dual-hosted git repository.

garydgregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-collections.git


The following commit(s) were added to refs/heads/master by this push:
     new 5974e618e TransformIterator now fail-fast on a null Iterator. (#686)
5974e618e is described below

commit 5974e618e61e5abe7ead57488c76c741c2e3e5f7
Author: Gary Gregory <[email protected]>
AuthorDate: Fri Jun 19 10:29:29 2026 -0400

    TransformIterator now fail-fast on a null Iterator. (#686)
---
 .../collections4/iterators/TransformIterator.java  | 51 ++++++++++------------
 .../iterators/TransformIteratorTest.java           | 15 +++++--
 2 files changed, 34 insertions(+), 32 deletions(-)

diff --git 
a/src/main/java/org/apache/commons/collections4/iterators/TransformIterator.java
 
b/src/main/java/org/apache/commons/collections4/iterators/TransformIterator.java
index ed7f1e1d4..d76f81f8c 100644
--- 
a/src/main/java/org/apache/commons/collections4/iterators/TransformIterator.java
+++ 
b/src/main/java/org/apache/commons/collections4/iterators/TransformIterator.java
@@ -14,9 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package org.apache.commons.collections4.iterators;
 
 import java.util.Iterator;
+import java.util.Objects;
 
 import org.apache.commons.collections4.Transformer;
 
@@ -31,39 +33,34 @@ public class TransformIterator<I, O> implements Iterator<O> 
{
 
     /** The iterator being used */
     private Iterator<? extends I> iterator;
-
     /** The transformer being used */
     private Transformer<? super I, ? extends O> transformer;
 
     /**
-     * Constructs a new {@code TransformIterator} that will not function
-     * until the {@link #setIterator(Iterator) setIterator} and
+     * Constructs a new {@code TransformIterator} that will not function until 
the {@link #setIterator(Iterator) setIterator} and
      * {@link #setTransformer(Transformer)} methods are invoked.
      */
     public TransformIterator() {
     }
 
     /**
-     * Constructs a new {@code TransformIterator} that won't transform
-     * elements from the given iterator.
+     * Constructs a new {@code TransformIterator} that won't transform 
elements from the given iterator.
      *
-     * @param iterator  the iterator to use
+     * @param iterator the iterator to use.
      */
     public TransformIterator(final Iterator<? extends I> iterator) {
-        this.iterator = iterator;
+        this(iterator, null);
     }
 
     /**
-     * Constructs a new {@code TransformIterator} that will use the
-     * given iterator and transformer.  If the given transformer is null,
-     * then objects will not be transformed.
+     * Constructs a new {@code TransformIterator} that will use the given 
iterator and transformer. If the given transformer is null, then objects will 
not be
+     * transformed.
      *
-     * @param iterator  the iterator to use
-     * @param transformer  the transformer to use, may be null to pass 
elements through unchanged
+     * @param iterator    the iterator to use, may not be null.
+     * @param transformer the transformer to use, may be null to pass elements 
through unchanged
      */
-    public TransformIterator(final Iterator<? extends I> iterator,
-                             final Transformer<? super I, ? extends O> 
transformer) {
-        this.iterator = iterator;
+    public TransformIterator(final Iterator<? extends I> iterator, final 
Transformer<? super I, ? extends O> transformer) {
+        this.iterator = Objects.requireNonNull(iterator);
         this.transformer = transformer;
     }
 
@@ -91,12 +88,11 @@ public class TransformIterator<I, O> implements Iterator<O> 
{
     }
 
     /**
-     * Gets the next object from the iteration, transforming it using the
-     * current transformer. If the transformer is null, no transformation
-     * occurs and the object from the iterator is returned directly.
+     * Gets the next object from the iteration, transforming it using the 
current transformer. If the transformer is null, no transformation occurs and 
the
+     * object from the iterator is returned directly.
      *
-     * @return the next object
-     * @throws java.util.NoSuchElementException if there are no more elements
+     * @return the next object.
+     * @throws java.util.NoSuchElementException if there are no more elements.
      */
     @Override
     public O next() {
@@ -109,30 +105,27 @@ public class TransformIterator<I, O> implements 
Iterator<O> {
     }
 
     /**
-     * Sets the iterator for this iterator to use.
-     * If iteration has started, this effectively resets the iterator.
+     * Sets the iterator for this iterator to use. If iteration has started, 
this effectively resets the iterator.
      *
-     * @param iterator  the iterator to use.
+     * @param iterator the iterator to use.
      */
     public void setIterator(final Iterator<? extends I> iterator) {
         this.iterator = iterator;
     }
 
     /**
-     * Sets the transformer this the iterator to use.
-     * A null transformer is a no-op transformer.
+     * Sets the transformer this the iterator to use. A null transformer is a 
no-op transformer.
      *
-     * @param transformer  the transformer to use, may be null to pass 
elements through unchanged.
+     * @param transformer the transformer to use, may be null to pass elements 
through unchanged.
      */
     public void setTransformer(final Transformer<? super I, ? extends O> 
transformer) {
         this.transformer = transformer;
     }
 
     /**
-     * Transforms the given object using the transformer.
-     * If the transformer is null, the original object is returned as-is.
+     * Transforms the given object using the transformer. If the transformer 
is null, the original object is returned as-is.
      *
-     * @param source  the object to transform, may be null.
+     * @param source the object to transform, may be null.
      * @return the transformed object, the original object the transformer is 
null.
      */
     @SuppressWarnings("unchecked")
diff --git 
a/src/test/java/org/apache/commons/collections4/iterators/TransformIteratorTest.java
 
b/src/test/java/org/apache/commons/collections4/iterators/TransformIteratorTest.java
index 8e6a18e8b..c14df25a2 100644
--- 
a/src/test/java/org/apache/commons/collections4/iterators/TransformIteratorTest.java
+++ 
b/src/test/java/org/apache/commons/collections4/iterators/TransformIteratorTest.java
@@ -14,32 +14,41 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package org.apache.commons.collections4.iterators;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.util.Arrays;
 
 import org.junit.jupiter.api.Test;
 
+/**
+ * Tests {@link TransformIterator}.
+ */
 class TransformIteratorTest {
 
+    @Test
+    void testConstructorInvariant() {
+        assertThrows(NullPointerException.class, () -> new 
TransformIterator<>(null));
+        assertThrows(NullPointerException.class, () -> new 
TransformIterator<>(null, null));
+    }
+
     /**
      * Tests <a 
href="https://issues.apache.org/jira/browse/COLLECTIONS-890";>COLLECTIONS-890</a>.
      */
     @Test
     void testNullTransformerActsAsPassThrough() {
         final TransformIterator<Integer, Integer> iterator = new 
TransformIterator<>(Arrays.asList(1, 2).iterator(), null);
-
         assertEquals(Integer.valueOf(1), iterator.next());
         assertEquals(Integer.valueOf(2), iterator.next());
     }
 
     @Test
     void testSetNullTransformerActsAsPassThrough() {
-        final TransformIterator<Integer, Integer> iterator = new 
TransformIterator<>(Arrays.asList(1, 2).iterator(), i -> i + 1);
+        final TransformIterator<Integer, Integer> iterator = new 
TransformIterator<>(Arrays.asList(1, 2).iterator(), null);
         iterator.setTransformer(null);
-
         assertEquals(Integer.valueOf(1), iterator.next());
         assertEquals(Integer.valueOf(2), iterator.next());
     }

Reply via email to