StreamUtil.of方法新增对 Iterator 支持

This commit is contained in:
青韵 2022-09-17 10:52:09 +08:00
parent 351f5305d9
commit 46daf6c1c0
2 changed files with 56 additions and 0 deletions

View File

@ -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 <T> 集合元素类型
* @return {@link Stream}
* @throws IllegalArgumentException 如果iterator为null抛出该异常
*/
public static <T> Stream<T> of(Iterator<T> iterator) {
return of(iterator, false);
}
/**
* {@link Iterator} 转换为 {@link Stream}
* @param iterator 迭代器
* @param parallel 是否并行
* @param <T> 集合元素类型
* @return {@link Stream}
* @throws IllegalArgumentException 如果iterator为null抛出该异常
*/
public static <T> Stream<T> of(Iterator<T> iterator, boolean parallel) {
Assert.notNull(iterator, "iterator must not be null!");
return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, 0), parallel);
}
/**
* 按行读取文件为{@link Stream}
*

View File

@ -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<Object>) null));
}
@Test
public void streamTestEmptyIterator() {
assertStreamIsEmpty(StreamUtil.of(new ArrayList<>().iterator()));
}
@Test
public void streamTestOrdinaryIterator() {
ArrayList<Integer> arrayList = CollUtil.newArrayList(1, 2, 3);
Assert.assertArrayEquals(new Integer[]{1, 2, 3}, StreamUtil.of(arrayList.iterator()).toArray());
HashSet<Integer> 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 ================
}