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
The following commit(s) were added to refs/heads/master by this push: new 0bee92719 Add Streams.of(Enumeration<E>) 0bee92719 is described below commit 0bee92719352c658886763618bf4eacc7dc2b7ec Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Sat Jul 16 09:27:15 2022 -0400 Add Streams.of(Enumeration<E>) --- src/changes/changes.xml | 1 + .../org/apache/commons/lang3/stream/Streams.java | 57 ++++++++++++++++++++++ .../apache/commons/lang3/stream/StreamsTest.java | 16 ++++++ 3 files changed, 74 insertions(+) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 454d5690a..e5e32ada0 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -157,6 +157,7 @@ The <action> type attribute can be add,update,fix,remove. <action type="add" dev="ggregory" due-to="Gary Gregory">Add SystemUtils.IS_JAVA_18.</action> <action issue="LANG-1627" type="add" dev="ggregory" due-to="Alberto Scotto, Avijit Chakraborty, Steve Bosman, Bruno P. Kinoshita, Gary Gregory">Add ArrayUtils.oneHot().</action> <action issue="LANG-1662" type="add" dev="ggregory" due-to="Daniel Augusto Veronezi Salvador, Gary Gregory, Bruno P. Kinoshita">Let ReflectionToStringBuilder only reflect given field names #849.</action> + <action type="add" dev="ggregory" due-to="Gary Gregory">Add Streams.of(Enumeration<E>).</action> <!-- UPDATE --> <action type="update" dev="ggregory" due-to="Dependabot, XenoAmess, Gary Gregory">Bump actions/cache from 2.1.4 to 3.0.5 #742, #752, #764, #833, #867.</action> <action type="update" dev="ggregory" due-to="Dependabot">Bump actions/checkout from 2 to 3 #819, #825, #859.</action> 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 e44ed7bf0..720405129 100644 --- a/src/main/java/org/apache/commons/lang3/stream/Streams.java +++ b/src/main/java/org/apache/commons/lang3/stream/Streams.java @@ -19,9 +19,12 @@ package org.apache.commons.lang3.stream; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Enumeration; import java.util.List; import java.util.Objects; import java.util.Set; +import java.util.Spliterator; +import java.util.Spliterators.AbstractSpliterator; import java.util.function.BiConsumer; import java.util.function.BinaryOperator; import java.util.function.Consumer; @@ -31,6 +34,7 @@ import java.util.function.Supplier; import java.util.stream.Collector; import java.util.stream.Collectors; import java.util.stream.Stream; +import java.util.stream.StreamSupport; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.function.Failable; @@ -122,6 +126,47 @@ public class Streams { } } + /** + * Helps implement {@link Streams#of(Enumeration)}. + * + * @param <T> The element type. + */ + private static class EnumerationSpliterator<T> extends AbstractSpliterator<T> { + + private final Enumeration<T> enumeration; + + /** + * Creates a spliterator reporting the given estimated size and additionalCharacteristics. + * + * @param estimatedSize the estimated size of this spliterator if known, otherwise {@code Long.MAX_VALUE}. + * @param additionalCharacteristics properties of this spliterator's source or elements. If {@code SIZED} is reported then this spliterator will + * additionally report {@code SUBSIZED}. + * @param enumeration The Enumeration to wrap. + */ + protected EnumerationSpliterator(final long estimatedSize, final int additionalCharacteristics, final Enumeration<T> enumeration) { + super(estimatedSize, additionalCharacteristics); + this.enumeration = Objects.requireNonNull(enumeration, "enumeration"); + } + + @Override + public void forEachRemaining(final Consumer<? super T> action) { + while (enumeration.hasMoreElements()) { + next(action); + } + } + + private boolean next(final Consumer<? super T> action) { + action.accept(enumeration.nextElement()); + return true; + + } + + @Override + public boolean tryAdvance(final Consumer<? super T> action) { + return enumeration.hasMoreElements() ? next(action) : false; + } + } + /** * A reduced, and simplified version of a {@link Stream} with failable method signatures. * @@ -572,6 +617,18 @@ public class Streams { return filter(collection, Objects::nonNull); } + /** + * Streams the elements of the given enumeration in order. + * + * @param <E> The enumeration element type. + * @param enumeration The enumeration to stream. + * @return a new stream. + * @since 3.13.0 + */ + public static <E> Stream<E> of(final Enumeration<E> enumeration) { + return StreamSupport.stream(new EnumerationSpliterator<>(Long.MAX_VALUE, Spliterator.ORDERED, enumeration), 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 625bff4cb..99b34204b 100644 --- a/src/test/java/org/apache/commons/lang3/stream/StreamsTest.java +++ b/src/test/java/org/apache/commons/lang3/stream/StreamsTest.java @@ -24,11 +24,13 @@ import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.DynamicTest.dynamicTest; import java.lang.reflect.UndeclaredThrowableException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Hashtable; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -161,6 +163,20 @@ public class StreamsTest extends AbstractLangTest { assertEquals(2, Streams.of("foo", "bar").count()); } + @Test + public void testOfEnumeration() { + final Hashtable<String, Integer> table = new Hashtable<>(); + assertEquals(0, Streams.of(table.elements()).count()); + table.put("One", 1); + assertEquals(1, Streams.of(table.elements()).count()); + table.put("Two", 2); + assertEquals(2, Streams.of(table.elements()).count()); + final List<String> collect = Streams.of(table.keys()).collect(Collectors.toList()); + assertTrue(collect.contains("One")); + assertTrue(collect.contains("Two")); + assertEquals(2, collect.size()); + } + @Test public void testSimpleStreamFilter() { final List<String> input = Arrays.asList("1", "2", "3", "4", "5", "6");