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 ================ }