From 46daf6c1c095cab5b98ecde3f1b37cd236f1763e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E9=9F=B5?= <1320162752@qq.com> Date: Sat, 17 Sep 2022 10:52:09 +0800 Subject: [PATCH 1/2] =?UTF-8?q?StreamUtil.of=E6=96=B9=E6=B3=95=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=AF=B9=20Iterator=20=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/hutool/core/stream/StreamUtil.java | 25 +++++++++++++++ .../cn/hutool/core/stream/StreamUtilTest.java | 31 +++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/hutool-core/src/main/java/cn/hutool/core/stream/StreamUtil.java b/hutool-core/src/main/java/cn/hutool/core/stream/StreamUtil.java index b3e04bbfc..89a304b9b 100644 --- a/hutool-core/src/main/java/cn/hutool/core/stream/StreamUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/stream/StreamUtil.java @@ -10,6 +10,7 @@ import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Iterator; import java.util.Spliterators; import java.util.function.Function; import java.util.function.UnaryOperator; @@ -56,6 +57,30 @@ public class StreamUtil { parallel); } + /** + * {@link Iterator} 转换为 {@link Stream} + * @param iterator 迭代器 + * @param 集合元素类型 + * @return {@link Stream} + * @throws IllegalArgumentException 如果iterator为null,抛出该异常 + */ + public static Stream of(Iterator iterator) { + return of(iterator, false); + } + + /** + * {@link Iterator} 转换为 {@link Stream} + * @param iterator 迭代器 + * @param parallel 是否并行 + * @param 集合元素类型 + * @return {@link Stream} + * @throws IllegalArgumentException 如果iterator为null,抛出该异常 + */ + public static Stream of(Iterator iterator, boolean parallel) { + Assert.notNull(iterator, "iterator must not be null!"); + return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, 0), parallel); + } + /** * 按行读取文件为{@link Stream} * diff --git a/hutool-core/src/test/java/cn/hutool/core/stream/StreamUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/stream/StreamUtilTest.java index a38d8ff26..edccf5b3c 100644 --- a/hutool-core/src/test/java/cn/hutool/core/stream/StreamUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/stream/StreamUtilTest.java @@ -1,8 +1,13 @@ package cn.hutool.core.stream; +import cn.hutool.core.collection.CollUtil; import org.junit.Assert; import org.junit.Test; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.stream.Collectors; import java.util.stream.Stream; public class StreamUtilTest { @@ -13,4 +18,30 @@ public class StreamUtilTest { final String result = stream.collect(CollectorUtil.joining(",")); Assert.assertEquals("2,4,8,16", result); } + + // === iterator === + @Test + public void streamTestNullIterator() { + Assert.assertThrows(IllegalArgumentException.class, () -> StreamUtil.of((Iterator) null)); + } + + @Test + public void streamTestEmptyIterator() { + assertStreamIsEmpty(StreamUtil.of(new ArrayList<>().iterator())); + } + + @Test + public void streamTestOrdinaryIterator() { + ArrayList arrayList = CollUtil.newArrayList(1, 2, 3); + Assert.assertArrayEquals(new Integer[]{1, 2, 3}, StreamUtil.of(arrayList.iterator()).toArray()); + + HashSet hashSet = CollUtil.newHashSet(1, 2, 3); + Assert.assertEquals(hashSet, StreamUtil.of(hashSet.iterator()).collect(Collectors.toSet())); + } + + void assertStreamIsEmpty(Stream stream) { + Assert.assertNotNull(stream); + Assert.assertEquals(0, stream.toArray().length); + } + // ================ stream test end ================ } From 05e14f0fb6b657ab47c6943b44d62752220479ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=92=E9=9F=B5?= <1320162752@qq.com> Date: Sat, 17 Sep 2022 11:14:05 +0800 Subject: [PATCH 2/2] =?UTF-8?q?StreamUtil.of(Iterable)=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/hutool/core/stream/StreamUtil.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/stream/StreamUtil.java b/hutool-core/src/main/java/cn/hutool/core/stream/StreamUtil.java index 89a304b9b..6b654dd73 100644 --- a/hutool-core/src/main/java/cn/hutool/core/stream/StreamUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/stream/StreamUtil.java @@ -1,6 +1,5 @@ package cn.hutool.core.stream; -import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.CharsetUtil; @@ -10,6 +9,7 @@ import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Collection; import java.util.Iterator; import java.util.Spliterators; import java.util.function.Function; @@ -52,9 +52,10 @@ public class StreamUtil { */ public static Stream of(Iterable iterable, boolean parallel) { Assert.notNull(iterable, "Iterable must be not null!"); - return StreamSupport.stream( - Spliterators.spliterator(CollUtil.toCollection(iterable), 0), - parallel); + + return iterable instanceof Collection ? + ((Collection) iterable).stream() : + StreamSupport.stream(iterable.spliterator(), parallel); } /**