You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2022/08/12 18:36:13 UTC

[commons-lang] 03/03: Add Streams.of(Iterator)

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

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

commit 717f163a6df989499dc5df2f1de2e1b6a23ba1e8
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Fri Aug 12 14:36:02 2022 -0400

    Add Streams.of(Iterator)
---
 .../java/org/apache/commons/lang3/StringUtils.java | 39 +++-------------------
 .../org/apache/commons/lang3/stream/Streams.java   | 14 ++++++++
 .../apache/commons/lang3/stream/StreamsTest.java   | 12 +++++++
 3 files changed, 30 insertions(+), 35 deletions(-)

diff --git a/src/main/java/org/apache/commons/lang3/StringUtils.java b/src/main/java/org/apache/commons/lang3/StringUtils.java
index 573b652fd..b1f198fb1 100644
--- a/src/main/java/org/apache/commons/lang3/StringUtils.java
+++ b/src/main/java/org/apache/commons/lang3/StringUtils.java
@@ -29,11 +29,11 @@ import java.util.Objects;
 import java.util.Set;
 import java.util.function.Supplier;
 import java.util.regex.Pattern;
-import java.util.stream.Stream;
 
 import org.apache.commons.lang3.function.Suppliers;
 import org.apache.commons.lang3.function.ToBooleanBiFunction;
 import org.apache.commons.lang3.stream.LangCollectors;
+import org.apache.commons.lang3.stream.Streams;
 
 /**
  * <p>Operations on {@link java.lang.String} that are
@@ -124,8 +124,6 @@ import org.apache.commons.lang3.stream.LangCollectors;
 //@Immutable
 public class StringUtils {
 
-    private static final int STRING_BUILDER_SIZE = 256;
-
     // Performance testing notes (JDK 1.4, Jul03, scolebourne)
     // Whitespace:
     // Character.isWhitespace() is faster than WHITESPACE.indexOf()
@@ -4386,7 +4384,6 @@ public class StringUtils {
      * @since 2.0
      */
     public static String join(final Iterator<?> iterator, final char separator) {
-
         // handle null, zero and one elements before building a buffer
         if (iterator == null) {
             return null;
@@ -4394,22 +4391,7 @@ public class StringUtils {
         if (!iterator.hasNext()) {
             return EMPTY;
         }
-
-        // two or more elements
-        final StringBuilder buf = new StringBuilder(STRING_BUILDER_SIZE); // Java default is 16, probably too small
-
-        while (iterator.hasNext()) {
-            final Object obj = iterator.next();
-            if (obj != null) {
-                buf.append(obj);
-            }
-            if (iterator.hasNext()) {
-                buf.append(separator);
-            }
-
-        }
-
-        return buf.toString();
+        return Streams.of(iterator).collect(LangCollectors.joining(toStringOrEmpty(String.valueOf(separator)), EMPTY, EMPTY, StringUtils::toStringOrEmpty));
     }
 
     /**
@@ -4433,20 +4415,7 @@ public class StringUtils {
         if (!iterator.hasNext()) {
             return EMPTY;
         }
-
-        // two or more elements
-        final StringBuilder buf = new StringBuilder(STRING_BUILDER_SIZE); // Java default is 16, probably too small
-
-        while (iterator.hasNext()) {
-            final Object obj = iterator.next();
-            if (obj != null) {
-                buf.append(obj);
-            }
-            if (separator != null && iterator.hasNext()) {
-                buf.append(separator);
-            }
-        }
-        return buf.toString();
+        return Streams.of(iterator).collect(LangCollectors.joining(toStringOrEmpty(separator), EMPTY, EMPTY, StringUtils::toStringOrEmpty));
     }
 
     /**
@@ -4727,7 +4696,7 @@ public class StringUtils {
      * {@code endIndex > array.length()}
      */
     public static String join(final Object[] array, final String delimiter, final int startIndex, final int endIndex) {
-        return array != null ? Stream.of(array).skip(startIndex).limit(Math.max(0, endIndex - startIndex))
+        return array != null ? Streams.of(array).skip(startIndex).limit(Math.max(0, endIndex - startIndex))
             .collect(LangCollectors.joining(delimiter, EMPTY, EMPTY, StringUtils::toStringOrEmpty)) : null;
     }
 
diff --git a/src/main/java/org/apache/commons/lang3/stream/Streams.java b/src/main/java/org/apache/commons/lang3/stream/Streams.java
index ee576c723..6ae7d1aa4 100644
--- a/src/main/java/org/apache/commons/lang3/stream/Streams.java
+++ b/src/main/java/org/apache/commons/lang3/stream/Streams.java
@@ -20,10 +20,12 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Enumeration;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Objects;
 import java.util.Set;
 import java.util.Spliterator;
+import java.util.Spliterators;
 import java.util.Spliterators.AbstractSpliterator;
 import java.util.function.BiConsumer;
 import java.util.function.BinaryOperator;
@@ -653,6 +655,18 @@ public class Streams {
         return iterable == null ? Stream.empty() : StreamSupport.stream(iterable.spliterator(), false);
     }
 
+    /**
+     * Creates a stream on the given Iterator.
+     *
+     * @param <E> the type of elements in the Iterator.
+     * @param iterator the Iterator to stream or null.
+     * @return a new Stream or {@link Stream#empty()} if the Iterator is null.
+     * @since 3.13.0
+     */
+    public static <E> Stream<E> of(final Iterator<E> iterator) {
+        return iterator == null ? Stream.empty() : StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false);
+    }
+
     /**
      * Null-safe version of {@link Stream#of(Object[])}.
      *
diff --git a/src/test/java/org/apache/commons/lang3/stream/StreamsTest.java b/src/test/java/org/apache/commons/lang3/stream/StreamsTest.java
index 073e9cc71..c15f95999 100644
--- a/src/test/java/org/apache/commons/lang3/stream/StreamsTest.java
+++ b/src/test/java/org/apache/commons/lang3/stream/StreamsTest.java
@@ -31,6 +31,7 @@ import java.lang.reflect.UndeclaredThrowableException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Hashtable;
+import java.util.Iterator;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -199,6 +200,17 @@ public class StreamsTest extends AbstractLangTest {
         assertEquals(0, Streams.of(input).collect(Collectors.toList()).size());
     }
 
+    @Test
+    public void testOfIteratorNotNull() {
+        assertEquals(2, Streams.of(Arrays.asList("A", "B").iterator()).collect(Collectors.toList()).size());
+    }
+
+    @Test
+    public void testOfIteratorNull() {
+        final Iterator<String> input = null;
+        assertEquals(0, Streams.of(input).collect(Collectors.toList()).size());
+    }
+
     @Test
     public void testSimpleStreamFilter() {
         final List<String> input = Arrays.asList("1", "2", "3", "4", "5", "6");