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 <garydgreg...@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");