This commit is contained in:
Looly 2022-07-29 23:38:03 +08:00
parent 14f09c2141
commit 547941e1c9
4 changed files with 56 additions and 20 deletions

View File

@ -5,6 +5,7 @@ import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.collection.iter.ArrayIter; import cn.hutool.core.collection.iter.ArrayIter;
import cn.hutool.core.collection.iter.IterUtil; import cn.hutool.core.collection.iter.IterUtil;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.exceptions.UtilException;
import cn.hutool.core.reflect.ConstructorUtil; import cn.hutool.core.reflect.ConstructorUtil;
import cn.hutool.core.reflect.TypeReference; import cn.hutool.core.reflect.TypeReference;
import cn.hutool.core.text.StrUtil; import cn.hutool.core.text.StrUtil;
@ -246,10 +247,15 @@ public class MapUtil {
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static <K, V> Map<K, V> createMap(final Class<?> mapType) { public static <K, V> Map<K, V> createMap(final Class<?> mapType) {
if (mapType.isAssignableFrom(AbstractMap.class)) { if (null == mapType || mapType.isAssignableFrom(AbstractMap.class)) {
return new HashMap<>(); return new HashMap<>();
} else { } else {
return (Map<K, V>) ConstructorUtil.newInstance(mapType); try{
return (Map<K, V>) ConstructorUtil.newInstance(mapType);
}catch (UtilException e){
// 不支持的map类型返回默认的HashMap
return new HashMap<>();
}
} }
} }

View File

@ -109,6 +109,9 @@ public class ConstructorUtil {
public static <T> T newInstance(final Class<T> clazz, final Object... params) throws UtilException { public static <T> T newInstance(final Class<T> clazz, final Object... params) throws UtilException {
if (ArrayUtil.isEmpty(params)) { if (ArrayUtil.isEmpty(params)) {
final Constructor<T> constructor = getConstructor(clazz); final Constructor<T> constructor = getConstructor(clazz);
if(null == constructor){
throw new UtilException("No constructor for [{}]", clazz);
}
try { try {
return constructor.newInstance(); return constructor.newInstance();
} catch (final Exception e) { } catch (final Exception e) {

View File

@ -208,11 +208,12 @@ public class FastStream<T> implements Stream<T>, Iterable<T> {
* 如果两个输入流都是有序的则结果流是有序的如果任一输入流是并行的则结果流是并行的 * 如果两个输入流都是有序的则结果流是有序的如果任一输入流是并行的则结果流是并行的
* 当结果流关闭时两个输入流的关闭处理程序都会被调用 * 当结果流关闭时两个输入流的关闭处理程序都会被调用
* *
* <p>从重复串行流进行拼接时可能会导致深度调用链甚至抛出 {@code StackOverflowException}</p>
*
* @param <T> 元素类型 * @param <T> 元素类型
* @param a 第一个流 * @param a 第一个流
* @param b 第二个流 * @param b 第二个流
* @return 拼接两个流之后的流 * @return 拼接两个流之后的流
* @implNote 从重复串行流进行拼接时可能会导致深度调用链甚至抛出 {@code StackOverflowException}
*/ */
public static <T> FastStream<T> concat(FastStream<? extends T> a, FastStream<? extends T> b) { public static <T> FastStream<T> concat(FastStream<? extends T> a, FastStream<? extends T> b) {
return new FastStream<>(Stream.concat(a, b)); return new FastStream<>(Stream.concat(a, b));
@ -279,6 +280,7 @@ public class FastStream<T> implements Stream<T>, Iterable<T> {
* 过滤元素返回与 指定操作结果 匹配 指定值 的元素组成的流 * 过滤元素返回与 指定操作结果 匹配 指定值 的元素组成的流
* 这是一个无状态中间操作 * 这是一个无状态中间操作
* *
* @param <R> 返回类型
* @param mapper 操作 * @param mapper 操作
* @param value 用来匹配的值 * @param value 用来匹配的值
* @return 指定操作结果 匹配 指定值 的元素组成的流 * @return 指定操作结果 匹配 指定值 的元素组成的流
@ -646,10 +648,10 @@ public class FastStream<T> implements Stream<T>, Iterable<T> {
* @param <A> 给定的数组类型 * @param <A> 给定的数组类型
* @return 包含此流元素的指定的数组 * @return 包含此流元素的指定的数组
* @throws ArrayStoreException 如果元素转换失败例如不是该元素类型及其父类则抛出该异常 * @throws ArrayStoreException 如果元素转换失败例如不是该元素类型及其父类则抛出该异常
* @apiNote 例如以下代码编译正常但运行时会抛出 {@link ArrayStoreException} * 例如以下代码编译正常但运行时会抛出 {@link ArrayStoreException}
* <pre>{@code * <pre>{@code
* String[] strings = Stream.<Integer>builder().add(1).build().toArray(String[]::new); * String[] strings = Stream.<Integer>builder().add(1).build().toArray(String[]::new);
* }</pre> * }</pre>
*/ */
public <A> A[] toArray(IntFunction<A[]> generator) { public <A> A[] toArray(IntFunction<A[]> generator) {
//noinspection SuspiciousToArrayCall //noinspection SuspiciousToArrayCall
@ -658,12 +660,8 @@ public class FastStream<T> implements Stream<T>, Iterable<T> {
/** /**
* 对元素进行聚合并返回聚合后的值相当于在for循环里写sum=sum+ints[i] * 对元素进行聚合并返回聚合后的值相当于在for循环里写sum=sum+ints[i]
* 这是一个终端操作 * 这是一个终端操作<br>
* * 求和最小值最大值平均值和转换成一个String字符串均为聚合操作
* @param identity 初始值还用于限定泛型
* @param accumulator 你想要的聚合操作
* @return 聚合计算后的值
* @apiNote 求和最小值最大值平均值和转换成一个String字符串均为聚合操作
* 例如这里对int进行求和可以写成 * 例如这里对int进行求和可以写成
* *
* <pre>{@code * <pre>{@code
@ -675,6 +673,10 @@ public class FastStream<T> implements Stream<T>, Iterable<T> {
* <pre>{@code * <pre>{@code
* Integer sum = integers.reduce(0, Integer::sum); * Integer sum = integers.reduce(0, Integer::sum);
* }</pre> * }</pre>
*
* @param identity 初始值还用于限定泛型
* @param accumulator 你想要的聚合操作
* @return 聚合计算后的值
*/ */
@Override @Override
public T reduce(T identity, BinaryOperator<T> accumulator) { public T reduce(T identity, BinaryOperator<T> accumulator) {
@ -698,15 +700,15 @@ public class FastStream<T> implements Stream<T>, Iterable<T> {
* return foundAny ? Optional.of(result) : Optional.empty(); * return foundAny ? Optional.of(result) : Optional.empty();
* }</pre> * }</pre>
* 但它不局限于顺序执行例如并行流等情况下 * 但它不局限于顺序执行例如并行流等情况下
* 这是一个终端操作 * 这是一个终端操作<br>
* 例如以下场景抛出 NPE
* <pre>{@code
* Optional<Integer> reduce = Stream.<Integer>builder().add(1).add(1).build().reduce((a, b) -> null);
* }</pre>
* *
* @param accumulator 你想要的聚合操作 * @param accumulator 你想要的聚合操作
* @return 聚合后用 {@link Optional}包裹的值 * @return 聚合后用 {@link Optional}包裹的值
* @throws NullPointerException 如果给定的聚合操作中执行后结果为空并用于下一次执行则抛出该异常 * @throws NullPointerException 如果给定的聚合操作中执行后结果为空并用于下一次执行则抛出该异常
* @apiNote 例如以下场景抛出 NPE
* <pre>{@code
* Optional<Integer> reduce = Stream.<Integer>builder().add(1).add(1).build().reduce((a, b) -> null);
* }</pre>
* @see #reduce(Object, BinaryOperator) * @see #reduce(Object, BinaryOperator)
* @see #min(Comparator) * @see #min(Comparator)
* @see #max(Comparator) * @see #max(Comparator)

29
pom.xml
View File

@ -97,7 +97,7 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId> <artifactId>maven-javadoc-plugin</artifactId>
<version>3.1.1</version> <version>3.4.0</version>
<executions> <executions>
<execution> <execution>
<phase>package</phase> <phase>package</phase>
@ -106,8 +106,33 @@
</goals> </goals>
</execution> </execution>
</executions> </executions>
<configuration>
<tags>
<tag>
<name>apiNote</name>
<placement>a</placement>
<head>API Note:</head>
</tag>
<tag>
<name>implSpec</name>
<placement>a</placement>
<head>Implementation Requirements:</head>
</tag>
<tag>
<name>implNote</name>
<placement>a</placement>
<head>Implementation Note:</head>
</tag>
<tag><name>param</name></tag>
<tag><name>return</name></tag>
<tag><name>throws</name></tag>
<tag><name>since</name></tag>
<tag><name>version</name></tag>
<tag><name>serialData</name></tag>
<tag><name>see</name></tag>
</tags>
</configuration>
</plugin> </plugin>
</plugins> </plugins>
</build> </build>