This commit is contained in:
Looly 2022-06-18 20:50:01 +08:00
parent 103738d9ef
commit 08b6716ca7
13 changed files with 438 additions and 378 deletions

View File

@ -0,0 +1,57 @@
package cn.hutool.core.collection;
import java.util.Collection;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.function.Predicate;
/**
* 自定义加入前检查的{@link LinkedBlockingQueue}给定一个检查函数在加入元素前检查此函数<br>
* 原理是通过Runtime#freeMemory()获取剩余内存当剩余内存低于指定的阈值时不再加入
*
* @author looly
* @since 6.0.0
*/
public class CheckedLinkedBlockingQueue<E> extends LinkedBlockingQueue<E> {
private static final long serialVersionUID = 1L;
protected final Predicate<E> checker;
/**
* 构造
*
* @param checker 检查函数
*/
public CheckedLinkedBlockingQueue(final Predicate<E> checker) {
super(Integer.MAX_VALUE);
this.checker = checker;
}
/**
* 构造
*
* @param c 初始集合
* @param checker 检查函数
*/
public CheckedLinkedBlockingQueue(final Collection<? extends E> c, final Predicate<E> checker) {
super(c);
this.checker = checker;
}
@Override
public void put(final E e) throws InterruptedException {
if (checker.test(e)) {
super.put(e);
}
}
@Override
public boolean offer(final E e, final long timeout, final TimeUnit unit) throws InterruptedException {
return checker.test(e) && super.offer(e, timeout, unit);
}
@Override
public boolean offer(final E e) {
return checker.test(e) && super.offer(e);
}
}

View File

@ -11,16 +11,14 @@ import cn.hutool.core.comparator.PropertyComparator;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.convert.ConverterRegistry; import cn.hutool.core.convert.ConverterRegistry;
import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.exceptions.UtilException;
import cn.hutool.core.lang.func.Editor;
import cn.hutool.core.lang.func.Filter;
import cn.hutool.core.lang.func.Func1; import cn.hutool.core.lang.func.Func1;
import cn.hutool.core.lang.func.Matcher;
import cn.hutool.core.lang.hash.Hash32; import cn.hutool.core.lang.hash.Hash32;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.reflect.ClassUtil; import cn.hutool.core.reflect.ClassUtil;
import cn.hutool.core.reflect.ConstructorUtil; import cn.hutool.core.reflect.ConstructorUtil;
import cn.hutool.core.reflect.FieldUtil; import cn.hutool.core.reflect.FieldUtil;
import cn.hutool.core.reflect.TypeUtil; import cn.hutool.core.reflect.TypeUtil;
import cn.hutool.core.stream.StreamUtil;
import cn.hutool.core.text.StrUtil; import cn.hutool.core.text.StrUtil;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.CharUtil;
@ -60,6 +58,8 @@ import java.util.function.BiConsumer;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.function.Supplier; import java.util.function.Supplier;
import java.util.function.UnaryOperator;
import java.util.stream.Collectors;
/** /**
* 集合相关工具类 * 集合相关工具类
@ -74,6 +74,90 @@ import java.util.function.Supplier;
*/ */
public class CollUtil { public class CollUtil {
// ---------------------------------------------------------------------- isEmpty
/**
* 集合是否为空
*
* @param collection 集合
* @return 是否为空
*/
public static boolean isEmpty(final Collection<?> collection) {
return collection == null || collection.isEmpty();
}
/**
* Iterable是否为空
*
* @param iterable Iterable对象
* @return 是否为空
* @see IterUtil#isEmpty(Iterable)
*/
public static boolean isEmpty(final Iterable<?> iterable) {
return IterUtil.isEmpty(iterable);
}
/**
* Iterator是否为空
*
* @param Iterator Iterator对象
* @return 是否为空
* @see IterUtil#isEmpty(Iterator)
*/
public static boolean isEmpty(final Iterator<?> Iterator) {
return IterUtil.isEmpty(Iterator);
}
/**
* Enumeration是否为空
*
* @param enumeration {@link Enumeration}
* @return 是否为空
*/
public static boolean isEmpty(final Enumeration<?> enumeration) {
return null == enumeration || false == enumeration.hasMoreElements();
}
/**
* Map是否为空
*
* @param map 集合
* @return 是否为空
* @see MapUtil#isEmpty(Map)
* @since 5.7.4
*/
public static boolean isEmpty(final Map<?, ?> map) {
return MapUtil.isEmpty(map);
}
/**
* 如果给定集合为空返回默认集合
*
* @param <T> 集合类型
* @param <E> 集合元素类型
* @param collection 集合
* @param defaultCollection 默认数组
* @return 非空empty的原集合或默认集合
* @since 4.6.9
*/
public static <T extends Collection<E>, E> T defaultIfEmpty(final T collection, final T defaultCollection) {
return isEmpty(collection) ? defaultCollection : collection;
}
/**
* 如果给定集合为空返回默认集合
*
* @param <T> 集合类型
* @param <E> 集合元素类型
* @param collection 集合
* @param supplier 默认值懒加载函数
* @return 非空empty的原集合或默认集合
* @since 5.7.15
*/
public static <T extends Collection<E>, E> T defaultIfEmpty(final T collection, final Supplier<? extends T> supplier) {
return isEmpty(collection) ? supplier.get() : collection;
}
/** /**
* 如果提供的集合为{@code null}返回一个不可变的默认空集合否则返回原集合<br> * 如果提供的集合为{@code null}返回一个不可变的默认空集合否则返回原集合<br>
* 空集合使用{@link Collections#emptySet()} * 空集合使用{@link Collections#emptySet()}
@ -84,7 +168,7 @@ public class CollUtil {
* @since 4.6.3 * @since 4.6.3
*/ */
public static <T> Set<T> emptyIfNull(final Set<T> set) { public static <T> Set<T> emptyIfNull(final Set<T> set) {
return (null == set) ? Collections.emptySet() : set; return ObjUtil.defaultIfNull(set, Collections.emptySet());
} }
/** /**
@ -97,7 +181,118 @@ public class CollUtil {
* @since 4.6.3 * @since 4.6.3
*/ */
public static <T> List<T> emptyIfNull(final List<T> list) { public static <T> List<T> emptyIfNull(final List<T> list) {
return (null == list) ? Collections.emptyList() : list; return ObjUtil.defaultIfNull(list, Collections.emptyList());
}
// ---------------------------------------------------------------------- isNotEmpty
/**
* 集合是否为非空
*
* @param collection 集合
* @return 是否为非空
*/
public static boolean isNotEmpty(final Collection<?> collection) {
return false == isEmpty(collection);
}
/**
* Iterable是否为空
*
* @param iterable Iterable对象
* @return 是否为空
* @see IterUtil#isNotEmpty(Iterable)
*/
public static boolean isNotEmpty(final Iterable<?> iterable) {
return IterUtil.isNotEmpty(iterable);
}
/**
* Iterator是否为空
*
* @param Iterator Iterator对象
* @return 是否为空
* @see IterUtil#isNotEmpty(Iterator)
*/
public static boolean isNotEmpty(final Iterator<?> Iterator) {
return IterUtil.isNotEmpty(Iterator);
}
/**
* Enumeration是否为空
*
* @param enumeration {@link Enumeration}
* @return 是否为空
*/
public static boolean isNotEmpty(final Enumeration<?> enumeration) {
return null != enumeration && enumeration.hasMoreElements();
}
/**
* 是否包含{@code null}元素
*
* @param iterable 被检查的Iterable对象如果为{@code null} 返回true
* @return 是否包含{@code null}元素
* @see IterUtil#hasNull(Iterable)
* @since 3.0.7
*/
public static boolean hasNull(final Iterable<?> iterable) {
return IterUtil.hasNull(iterable);
}
/**
* Map是否为非空
*
* @param map 集合
* @return 是否为非空
* @see MapUtil#isNotEmpty(Map)
* @since 5.7.4
*/
public static boolean isNotEmpty(final Map<?, ?> map) {
return MapUtil.isNotEmpty(map);
}
/**
* 去重集合
*
* @param <T> 集合元素类型
* @param collection 集合
* @return {@link ArrayList}
*/
public static <T> ArrayList<T> distinct(final Collection<T> collection) {
if (isEmpty(collection)) {
return new ArrayList<>();
} else if (collection instanceof Set) {
return new ArrayList<>(collection);
} else {
return new ArrayList<>(new LinkedHashSet<>(collection));
}
}
/**
* 根据函数生成的KEY去重集合如根据Bean的某个或者某些字段完成去重<br>
* 去重可选是保留最先加入的值还是后加入的值
*
* @param <T> 集合元素类型
* @param <K> 唯一键类型
* @param collection 集合
* @param uniqueGenerator 唯一键生成器
* @param override 是否覆盖模式如果为{@code true}加入的新值会覆盖相同key的旧值否则会忽略新加值
* @return {@link ArrayList}
* @since 5.8.0
*/
public static <T, K> List<T> distinct(final Collection<T> collection, final Function<T, K> uniqueGenerator, final boolean override) {
if (isEmpty(collection)) {
return new ArrayList<>();
}
final UniqueKeySet<K, T> set = new UniqueKeySet<>(true, uniqueGenerator);
if (override) {
set.addAll(collection);
} else {
set.addAllIfAbsent(collection);
}
return new ArrayList<>(set);
} }
/** /**
@ -729,49 +924,6 @@ public class CollUtil {
return list; return list;
} }
/**
* 去重集合
*
* @param <T> 集合元素类型
* @param collection 集合
* @return {@link ArrayList}
*/
public static <T> ArrayList<T> distinct(final Collection<T> collection) {
if (isEmpty(collection)) {
return new ArrayList<>();
} else if (collection instanceof Set) {
return new ArrayList<>(collection);
} else {
return new ArrayList<>(new LinkedHashSet<>(collection));
}
}
/**
* 根据函数生成的KEY去重集合如根据Bean的某个或者某些字段完成去重<br>
* 去重可选是保留最先加入的值还是后加入的值
*
* @param <T> 集合元素类型
* @param <K> 唯一键类型
* @param collection 集合
* @param uniqueGenerator 唯一键生成器
* @param override 是否覆盖模式如果为{@code true}加入的新值会覆盖相同key的旧值否则会忽略新加值
* @return {@link ArrayList}
* @since 5.8.0
*/
public static <T, K> List<T> distinct(final Collection<T> collection, final Function<T, K> uniqueGenerator, final boolean override) {
if (isEmpty(collection)) {
return new ArrayList<>();
}
final UniqueKeySet<K, T> set = new UniqueKeySet<>(true, uniqueGenerator);
if (override) {
set.addAll(collection);
} else {
set.addAllIfAbsent(collection);
}
return new ArrayList<>(set);
}
/** /**
* 截取列表的部分 * 截取列表的部分
* *
@ -875,7 +1027,7 @@ public class CollUtil {
* @param editor 编辑器接口{@code null}返回原集合 * @param editor 编辑器接口{@code null}返回原集合
* @return 过滤后的集合 * @return 过滤后的集合
*/ */
public static <T> Collection<T> edit(final Collection<T> collection, final Editor<T> editor) { public static <T> Collection<T> edit(final Collection<T> collection, final UnaryOperator<T> editor) {
if (null == collection || null == editor) { if (null == collection || null == editor) {
return collection; return collection;
} }
@ -887,7 +1039,7 @@ public class CollUtil {
T modified; T modified;
for (final T t : collection) { for (final T t : collection) {
modified = editor.edit(t); modified = editor.apply(t);
if (null != modified) { if (null != modified) {
collection2.add(modified); collection2.add(modified);
} }
@ -897,23 +1049,23 @@ public class CollUtil {
/** /**
* 过滤<br> * 过滤<br>
* 过滤过程通过传入的Filter实现来过滤返回需要的元素内容这个Filter实现可以实现以下功能 * 过滤过程通过传入的{@link Predicate}实现来过滤返回需要的元素内容可以实现以下功能
* *
* <pre> * <pre>
* 1过滤出需要的对象{@link Filter#accept(Object)}方法返回true的对象将被加入结果集合中 * 1过滤出需要的对象{@link Predicate#test(Object)}方法返回true的对象将被加入结果集合中
* </pre> * </pre>
* *
* @param <T> 集合元素类型 * @param <T> 集合元素类型
* @param collection 集合 * @param collection 集合
* @param filter 过滤器{@code null}返回原集合 * @param predicate 过滤器{@code null}返回原集合
* @return 过滤后的数组 * @return 过滤后的数组
* @since 3.1.0 * @since 6.0.0
*/ */
public static <T> Collection<T> filterNew(final Collection<T> collection, final Filter<T> filter) { public static <T> Collection<T> filter(final Collection<T> collection, final Predicate<T> predicate) {
if (null == collection || null == filter) { if (null == collection || null == predicate) {
return collection; return collection;
} }
return edit(collection, t -> filter.accept(t) ? t : null); return edit(collection, t -> predicate.test(t) ? t : null);
} }
/** /**
@ -942,8 +1094,8 @@ public class CollUtil {
* @return 处理后的集合 * @return 处理后的集合
* @since 4.6.5 * @since 4.6.5
*/ */
public static <T extends Collection<E>, E> T filter(final T collection, final Predicate<E> filter) { public static <T extends Collection<E>, E> T remove(final T collection, final Predicate<E> filter) {
return IterUtil.filter(collection, filter); return IterUtil.remove(collection, filter);
} }
/** /**
@ -956,7 +1108,7 @@ public class CollUtil {
* @since 3.2.2 * @since 3.2.2
*/ */
public static <T extends Collection<E>, E> T removeNull(final T collection) { public static <T extends Collection<E>, E> T removeNull(final T collection) {
return filter(collection, Objects::nonNull); return remove(collection, Objects::isNull);
} }
/** /**
@ -969,7 +1121,7 @@ public class CollUtil {
* @since 3.2.2 * @since 3.2.2
*/ */
public static <T extends Collection<E>, E extends CharSequence> T removeEmpty(final T collection) { public static <T extends Collection<E>, E extends CharSequence> T removeEmpty(final T collection) {
return filter(collection, StrUtil::isNotEmpty); return remove(collection, StrUtil::isEmpty);
} }
/** /**
@ -982,7 +1134,7 @@ public class CollUtil {
* @since 3.2.2 * @since 3.2.2
*/ */
public static <T extends Collection<E>, E extends CharSequence> T removeBlank(final T collection) { public static <T extends Collection<E>, E extends CharSequence> T removeBlank(final T collection) {
return filter(collection, StrUtil::isNotBlank); return remove(collection, StrUtil::isBlank);
} }
/** /**
@ -1028,30 +1180,19 @@ public class CollUtil {
} }
/** /**
* 通过Editor抽取集合元素中的某些值返回为新列表<br> * 通过func自定义一个规则此规则将原集合中的元素转换成新的元素生成新的列表返回<br>
* 例如提供的是一个Bean列表通过Editor接口实现获取某个字段值返回这个字段值组成的新列表 * 例如提供的是一个Bean列表通过Function接口实现获取某个字段值返回这个字段值组成的新列表<br>
* 默认忽略映射后{@code null}的情况
* *
* @param <T> 集合元素类型
* @param <R> 返回集合元素类型
* @param collection 原集合 * @param collection 原集合
* @param editor 编辑器 * @param func 编辑函数
* @return 抽取后的新列表 * @return 抽取后的新列表
* @since 5.3.5
*/ */
public static List<Object> extract(final Iterable<?> collection, final Editor<Object> editor) { public static <T, R> List<R> map(final Iterable<T> collection, final Function<? super T, ? extends R> func) {
return extract(collection, editor, false); return map(collection, func, true);
}
/**
* 通过Editor抽取集合元素中的某些值返回为新列表<br>
* 例如提供的是一个Bean列表通过Editor接口实现获取某个字段值返回这个字段值组成的新列表
*
* @param collection 原集合
* @param editor 编辑器
* @param ignoreNull 是否忽略空值
* @return 抽取后的新列表
* @see #map(Iterable, Function, boolean)
* @since 4.5.7
*/
public static List<Object> extract(final Iterable<?> collection, final Editor<Object> editor, final boolean ignoreNull) {
return map(collection, editor::edit, ignoreNull);
} }
/** /**
@ -1061,29 +1202,20 @@ public class CollUtil {
* @param <T> 集合元素类型 * @param <T> 集合元素类型
* @param <R> 返回集合元素类型 * @param <R> 返回集合元素类型
* @param collection 原集合 * @param collection 原集合
* @param func 编辑函数 * @param mapper 编辑函数
* @param ignoreNull 是否忽略空值这里的空值包括函数处理前和处理后的null值 * @param ignoreNull 是否忽略空值这里的空值包括函数处理前和处理后的null值
* @return 抽取后的新列表 * @return 抽取后的新列表
* @see java.util.stream.Stream#map(Function)
* @since 5.3.5 * @since 5.3.5
*/ */
public static <T, R> List<R> map(final Iterable<T> collection, final Function<? super T, ? extends R> func, final boolean ignoreNull) { public static <T, R> List<R> map(final Iterable<T> collection, final Function<? super T, ? extends R> mapper, final boolean ignoreNull) {
final List<R> fieldValueList = new ArrayList<>(); return StreamUtil.of(collection)
if (null == collection) { // 检查映射前的结果
return fieldValueList; .filter((e) -> (false == ignoreNull) || null != e)
} .map(mapper)
// 检查映射后的结果
R value; .filter((e) -> (false == ignoreNull) || null != e)
for (final T t : collection) { .collect(Collectors.toList());
if (null == t && ignoreNull) {
continue;
}
value = func.apply(t);
if (null == value && ignoreNull) {
continue;
}
fieldValueList.add(value);
}
return fieldValueList;
} }
/** /**
@ -1095,7 +1227,7 @@ public class CollUtil {
* @return 字段值列表 * @return 字段值列表
* @since 3.1.0 * @since 3.1.0
*/ */
public static List<Object> getFieldValues(final Iterable<?> collection, final String fieldName) { public static Collection<Object> getFieldValues(final Iterable<?> collection, final String fieldName) {
return getFieldValues(collection, fieldName, false); return getFieldValues(collection, fieldName, false);
} }
@ -1131,7 +1263,7 @@ public class CollUtil {
* @since 4.5.6 * @since 4.5.6
*/ */
public static <T> List<T> getFieldValues(final Iterable<?> collection, final String fieldName, final Class<T> elementType) { public static <T> List<T> getFieldValues(final Iterable<?> collection, final String fieldName, final Class<T> elementType) {
final List<Object> fieldValues = getFieldValues(collection, fieldName); final Collection<Object> fieldValues = getFieldValues(collection, fieldName);
return Convert.toList(elementType, fieldValues); return Convert.toList(elementType, fieldValues);
} }
@ -1170,14 +1302,14 @@ public class CollUtil {
* *
* @param <T> 集合元素类型 * @param <T> 集合元素类型
* @param collection 集合 * @param collection 集合
* @param filter 过滤器满足过滤条件的第一个元素将被返回 * @param predicate 过滤器满足过滤条件的第一个元素将被返回
* @return 满足过滤条件的第一个元素 * @return 满足过滤条件的第一个元素
* @since 3.1.0 * @since 3.1.0
*/ */
public static <T> T findOne(final Iterable<T> collection, final Filter<T> filter) { public static <T> T findOne(final Iterable<T> collection, final Predicate<T> predicate) {
if (null != collection) { if (null != collection) {
for (final T t : collection) { for (final T t : collection) {
if (filter.accept(t)) { if (predicate.test(t)) {
return t; return t;
} }
} }
@ -1215,16 +1347,16 @@ public class CollUtil {
/** /**
* 集合中匹配规则的数量 * 集合中匹配规则的数量
* *
* @param <T> 集合元素类型 * @param <T> 集合元素类型
* @param iterable {@link Iterable} * @param iterable {@link Iterable}
* @param matcher 匹配器为空则全部匹配 * @param predicate 匹配器为空则全部匹配
* @return 匹配数量 * @return 匹配数量
*/ */
public static <T> int count(final Iterable<T> iterable, final Matcher<T> matcher) { public static <T> int count(final Iterable<T> iterable, final Predicate<T> predicate) {
int count = 0; int count = 0;
if (null != iterable) { if (null != iterable) {
for (final T t : iterable) { for (final T t : iterable) {
if (null == matcher || matcher.match(t)) { if (null == predicate || predicate.test(t)) {
count++; count++;
} }
} }
@ -1238,15 +1370,15 @@ public class CollUtil {
* *
* @param <T> 元素类型 * @param <T> 元素类型
* @param collection 集合 * @param collection 集合
* @param matcher 匹配器为空则全部匹配 * @param predicate 匹配器为空则全部匹配
* @return 第一个位置 * @return 第一个位置
* @since 5.6.6 * @since 5.6.6
*/ */
public static <T> int indexOf(final Collection<T> collection, final Matcher<T> matcher) { public static <T> int indexOf(final Collection<T> collection, final Predicate<T> predicate) {
if (isNotEmpty(collection)) { if (isNotEmpty(collection)) {
int index = 0; int index = 0;
for (final T t : collection) { for (final T t : collection) {
if (null == matcher || matcher.match(t)) { if (null == predicate || predicate.test(t)) {
return index; return index;
} }
index++; index++;
@ -1261,20 +1393,20 @@ public class CollUtil {
* *
* @param <T> 元素类型 * @param <T> 元素类型
* @param collection 集合 * @param collection 集合
* @param matcher 匹配器为空则全部匹配 * @param predicate 匹配器为空则全部匹配
* @return 最后一个位置 * @return 最后一个位置
* @since 5.6.6 * @since 5.6.6
*/ */
public static <T> int lastIndexOf(final Collection<T> collection, final Matcher<T> matcher) { public static <T> int lastIndexOf(final Collection<T> collection, final Predicate<T> predicate) {
if (collection instanceof List) { if (collection instanceof List) {
// List的查找最后一个有优化算法 // List的查找最后一个有优化算法
return ListUtil.lastIndexOf((List<T>) collection, matcher); return ListUtil.lastIndexOf((List<T>) collection, predicate);
} }
int matchIndex = -1; int matchIndex = -1;
if (isNotEmpty(collection)) { if (isNotEmpty(collection)) {
int index = collection.size(); int index = collection.size();
for (final T t : collection) { for (final T t : collection) {
if (null == matcher || matcher.match(t)) { if (null == predicate || predicate.test(t)) {
matchIndex = index; matchIndex = index;
} }
index--; index--;
@ -1289,16 +1421,16 @@ public class CollUtil {
* *
* @param <T> 元素类型 * @param <T> 元素类型
* @param collection 集合 * @param collection 集合
* @param matcher 匹配器为空则全部匹配 * @param predicate 匹配器为空则全部匹配
* @return 位置数组 * @return 位置数组
* @since 5.2.5 * @since 5.2.5
*/ */
public static <T> int[] indexOfAll(final Collection<T> collection, final Matcher<T> matcher) { public static <T> int[] indexOfAll(final Collection<T> collection, final Predicate<T> predicate) {
final List<Integer> indexList = new ArrayList<>(); final List<Integer> indexList = new ArrayList<>();
if (null != collection) { if (null != collection) {
int index = 0; int index = 0;
for (final T t : collection) { for (final T t : collection) {
if (null == matcher || matcher.match(t)) { if (null == predicate || predicate.test(t)) {
indexList.add(index); indexList.add(index);
} }
index++; index++;
@ -1307,158 +1439,6 @@ public class CollUtil {
return Convert.convert(int[].class, indexList); return Convert.convert(int[].class, indexList);
} }
// ---------------------------------------------------------------------- isEmpty
/**
* 集合是否为空
*
* @param collection 集合
* @return 是否为空
*/
public static boolean isEmpty(final Collection<?> collection) {
return collection == null || collection.isEmpty();
}
/**
* 如果给定集合为空返回默认集合
*
* @param <T> 集合类型
* @param <E> 集合元素类型
* @param collection 集合
* @param defaultCollection 默认数组
* @return 非空empty的原集合或默认集合
* @since 4.6.9
*/
public static <T extends Collection<E>, E> T defaultIfEmpty(final T collection, final T defaultCollection) {
return isEmpty(collection) ? defaultCollection : collection;
}
/**
* 如果给定集合为空返回默认集合
*
* @param <T> 集合类型
* @param <E> 集合元素类型
* @param collection 集合
* @param supplier 默认值懒加载函数
* @return 非空empty的原集合或默认集合
* @since 5.7.15
*/
public static <T extends Collection<E>, E> T defaultIfEmpty(final T collection, final Supplier<? extends T> supplier) {
return isEmpty(collection) ? supplier.get() : collection;
}
/**
* Iterable是否为空
*
* @param iterable Iterable对象
* @return 是否为空
* @see IterUtil#isEmpty(Iterable)
*/
public static boolean isEmpty(final Iterable<?> iterable) {
return IterUtil.isEmpty(iterable);
}
/**
* Iterator是否为空
*
* @param Iterator Iterator对象
* @return 是否为空
* @see IterUtil#isEmpty(Iterator)
*/
public static boolean isEmpty(final Iterator<?> Iterator) {
return IterUtil.isEmpty(Iterator);
}
/**
* Enumeration是否为空
*
* @param enumeration {@link Enumeration}
* @return 是否为空
*/
public static boolean isEmpty(final Enumeration<?> enumeration) {
return null == enumeration || false == enumeration.hasMoreElements();
}
/**
* Map是否为空
*
* @param map 集合
* @return 是否为空
* @see MapUtil#isEmpty(Map)
* @since 5.7.4
*/
public static boolean isEmpty(final Map<?, ?> map) {
return MapUtil.isEmpty(map);
}
// ---------------------------------------------------------------------- isNotEmpty
/**
* 集合是否为非空
*
* @param collection 集合
* @return 是否为非空
*/
public static boolean isNotEmpty(final Collection<?> collection) {
return false == isEmpty(collection);
}
/**
* Iterable是否为空
*
* @param iterable Iterable对象
* @return 是否为空
* @see IterUtil#isNotEmpty(Iterable)
*/
public static boolean isNotEmpty(final Iterable<?> iterable) {
return IterUtil.isNotEmpty(iterable);
}
/**
* Iterator是否为空
*
* @param Iterator Iterator对象
* @return 是否为空
* @see IterUtil#isNotEmpty(Iterator)
*/
public static boolean isNotEmpty(final Iterator<?> Iterator) {
return IterUtil.isNotEmpty(Iterator);
}
/**
* Enumeration是否为空
*
* @param enumeration {@link Enumeration}
* @return 是否为空
*/
public static boolean isNotEmpty(final Enumeration<?> enumeration) {
return null != enumeration && enumeration.hasMoreElements();
}
/**
* 是否包含{@code null}元素
*
* @param iterable 被检查的Iterable对象如果为{@code null} 返回true
* @return 是否包含{@code null}元素
* @see IterUtil#hasNull(Iterable)
* @since 3.0.7
*/
public static boolean hasNull(final Iterable<?> iterable) {
return IterUtil.hasNull(iterable);
}
/**
* Map是否为非空
*
* @param map 集合
* @return 是否为非空
* @see MapUtil#isNotEmpty(Map)
* @since 5.7.4
*/
public static boolean isNotEmpty(final Map<?, ?> map) {
return MapUtil.isNotEmpty(map);
}
// ---------------------------------------------------------------------- zip // ---------------------------------------------------------------------- zip
/** /**
@ -1864,23 +1844,6 @@ public class CollUtil {
return collection; return collection;
} }
/**
* 将另一个列表中的元素加入到列表中如果列表中已经存在此元素则忽略之
*
* @param <T> 集合元素类型
* @param list 列表
* @param otherList 其它列表
* @return 此列表
*/
public static <T> List<T> addAllIfNotContains(final List<T> list, final List<T> otherList) {
for (final T t : otherList) {
if (false == list.contains(t)) {
list.add(t);
}
}
return list;
}
/** /**
* 获取集合中指定下标的元素值下标可以为负数例如-1表示最后一个元素<br> * 获取集合中指定下标的元素值下标可以为负数例如-1表示最后一个元素<br>
* 如果元素越界返回null * 如果元素越界返回null
@ -2440,7 +2403,7 @@ public class CollUtil {
* @since 5.2.6 * @since 5.2.6
*/ */
public static <T> Collection<T> unmodifiable(final Collection<? extends T> c) { public static <T> Collection<T> unmodifiable(final Collection<? extends T> c) {
if(null == c){ if (null == c) {
return null; return null;
} }
return Collections.unmodifiableCollection(c); return Collections.unmodifiableCollection(c);

View File

@ -7,7 +7,6 @@ import cn.hutool.core.collection.partition.RandomAccessAvgPartition;
import cn.hutool.core.collection.partition.RandomAccessPartition; import cn.hutool.core.collection.partition.RandomAccessPartition;
import cn.hutool.core.comparator.PinyinComparator; import cn.hutool.core.comparator.PinyinComparator;
import cn.hutool.core.comparator.PropertyComparator; import cn.hutool.core.comparator.PropertyComparator;
import cn.hutool.core.lang.func.Matcher;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.PageUtil; import cn.hutool.core.util.PageUtil;
@ -23,6 +22,7 @@ import java.util.List;
import java.util.RandomAccess; import java.util.RandomAccess;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Predicate;
/** /**
* List相关工具类 * List相关工具类
@ -473,12 +473,12 @@ public class ListUtil {
* @return 最后一个位置 * @return 最后一个位置
* @since 5.6.6 * @since 5.6.6
*/ */
public static <T> int lastIndexOf(final List<T> list, final Matcher<T> matcher) { public static <T> int lastIndexOf(final List<T> list, final Predicate<T> matcher) {
if (null != list) { if (null != list) {
final int size = list.size(); final int size = list.size();
if (size > 0) { if (size > 0) {
for (int i = size - 1; i >= 0; i--) { for (int i = size - 1; i >= 0; i--) {
if (null == matcher || matcher.match(list.get(i))) { if (null == matcher || matcher.test(list.get(i))) {
return i; return i;
} }
} }
@ -496,7 +496,7 @@ public class ListUtil {
* @return 位置数组 * @return 位置数组
* @since 5.2.5 * @since 5.2.5
*/ */
public static <T> int[] indexOfAll(final List<T> list, final Matcher<T> matcher) { public static <T> int[] indexOfAll(final List<T> list, final Predicate<T> matcher) {
return CollUtil.indexOfAll(list, matcher); return CollUtil.indexOfAll(list, matcher);
} }
@ -624,4 +624,21 @@ public class ListUtil {
} }
return Collections.unmodifiableList(c); return Collections.unmodifiableList(c);
} }
/**
* 将另一个列表中的元素加入到列表中如果列表中已经存在此元素则忽略之
*
* @param <T> 集合元素类型
* @param list 列表
* @param otherList 其它列表
* @return 此列表
*/
public static <T> List<T> addAllIfNotContains(final List<T> list, final List<T> otherList) {
for (final T t : otherList) {
if (false == list.contains(t)) {
list.add(t);
}
}
return list;
}
} }

View File

@ -21,7 +21,7 @@ import cn.hutool.core.util.RuntimeUtil;
import java.util.Collection; import java.util.Collection;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit; import java.util.function.Predicate;
/** /**
* 内存安全的{@link LinkedBlockingQueue}可以解决OOM问题<br> * 内存安全的{@link LinkedBlockingQueue}可以解决OOM问题<br>
@ -35,10 +35,8 @@ import java.util.concurrent.TimeUnit;
* @author incubator-shenyu * @author incubator-shenyu
* @since 6.0.0 * @since 6.0.0
*/ */
public class MemorySafeLinkedBlockingQueue<E> extends LinkedBlockingQueue<E> { public class MemorySafeLinkedBlockingQueue<E> extends CheckedLinkedBlockingQueue<E> {
private static final long serialVersionUID = 8032578371749960142L; private static final long serialVersionUID = 1L;
private long maxFreeMemory;
/** /**
* 构造 * 构造
@ -46,8 +44,7 @@ public class MemorySafeLinkedBlockingQueue<E> extends LinkedBlockingQueue<E> {
* @param maxFreeMemory 最大剩余内存大小当实际内存小于这个值时不再加入元素 * @param maxFreeMemory 最大剩余内存大小当实际内存小于这个值时不再加入元素
*/ */
public MemorySafeLinkedBlockingQueue(final long maxFreeMemory) { public MemorySafeLinkedBlockingQueue(final long maxFreeMemory) {
super(Integer.MAX_VALUE); super(new MemoryChecker<>(maxFreeMemory));
this.maxFreeMemory = maxFreeMemory;
} }
/** /**
@ -58,8 +55,7 @@ public class MemorySafeLinkedBlockingQueue<E> extends LinkedBlockingQueue<E> {
*/ */
public MemorySafeLinkedBlockingQueue(final Collection<? extends E> c, public MemorySafeLinkedBlockingQueue(final Collection<? extends E> c,
final long maxFreeMemory) { final long maxFreeMemory) {
super(c); super(c, new MemoryChecker<>(maxFreeMemory));
this.maxFreeMemory = maxFreeMemory;
} }
/** /**
@ -68,7 +64,7 @@ public class MemorySafeLinkedBlockingQueue<E> extends LinkedBlockingQueue<E> {
* @param maxFreeMemory the max free memory * @param maxFreeMemory the max free memory
*/ */
public void setMaxFreeMemory(final int maxFreeMemory) { public void setMaxFreeMemory(final int maxFreeMemory) {
this.maxFreeMemory = maxFreeMemory; ((MemoryChecker<E>) this.checker).maxFreeMemory = maxFreeMemory;
} }
/** /**
@ -77,34 +73,26 @@ public class MemorySafeLinkedBlockingQueue<E> extends LinkedBlockingQueue<E> {
* @return the max free memory limit * @return the max free memory limit
*/ */
public long getMaxFreeMemory() { public long getMaxFreeMemory() {
return maxFreeMemory; return ((MemoryChecker<E>) this.checker).maxFreeMemory;
} }
/** /**
* determine if there is any remaining free memory.<br> * 根据剩余内存判定的检查器
* 剩余内存是否大于给定阈值
* *
* @return {@code true}则表示大于阈值可以加入元素否则无法加入 * @param <E> 元素类型
*/ */
public boolean hasRemainedMemory() { private static class MemoryChecker<E> implements Predicate<E> {
return FreeMemoryCalculator.INSTANCE.getResult() > maxFreeMemory;
}
@Override private long maxFreeMemory;
public void put(final E e) throws InterruptedException {
if (hasRemainedMemory()) { private MemoryChecker(final long maxFreeMemory) {
super.put(e); this.maxFreeMemory = maxFreeMemory;
} }
}
@Override @Override
public boolean offer(final E e, final long timeout, final TimeUnit unit) throws InterruptedException { public boolean test(final E e) {
return hasRemainedMemory() && super.offer(e, timeout, unit); return FreeMemoryCalculator.INSTANCE.getResult() > maxFreeMemory;
} }
@Override
public boolean offer(final E e) {
return hasRemainedMemory() && super.offer(e);
} }
/** /**

View File

@ -3,7 +3,6 @@ package cn.hutool.core.collection.iter;
import cn.hutool.core.collection.ListUtil; import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.exceptions.UtilException;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.lang.func.Editor;
import cn.hutool.core.lang.func.Filter; import cn.hutool.core.lang.func.Filter;
import cn.hutool.core.lang.func.Func1; import cn.hutool.core.lang.func.Func1;
import cn.hutool.core.lang.func.Matcher; import cn.hutool.core.lang.func.Matcher;
@ -30,6 +29,7 @@ import java.util.Objects;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.function.UnaryOperator;
/** /**
* {@link Iterable} {@link Iterator} 相关工具类 * {@link Iterable} {@link Iterator} 相关工具类
@ -682,68 +682,68 @@ public class IterUtil {
* @return 过滤后的集合 * @return 过滤后的集合
* @since 5.7.1 * @since 5.7.1
*/ */
public static <T> List<T> edit(final Iterable<T> iter, final Editor<T> editor) { public static <T> List<T> edit(final Iterator<T> iter, final UnaryOperator<T> editor) {
final List<T> result = new ArrayList<>(); final List<T> result = new ArrayList<>();
if (null == iter) { if (null == iter) {
return result; return result;
} }
T modified; T modified;
for (final T t : iter) { while(iter.hasNext()){
modified = (null == editor) ? t : editor.edit(t); modified = (null == editor) ? iter.next() : editor.apply(iter.next());
if (null != modified) { if (null != modified) {
result.add(t); result.add(modified);
} }
} }
return result; return result;
} }
/** /**
* 过滤集合此方法在原集合上直接修改<br> * 移除集合中满足条件的所有元素此方法在原集合上直接修改<br>
* 通过实现Filter接口完成元素的过滤这个Filter实现可以实现以下功能 * 通过实现{@link Predicate}接口完成元素的移除可以实现以下功能
* *
* <pre> * <pre>
* 1过滤出需要的对象{@link Filter#accept(Object)}方法返回false的对象将被使用{@link Iterator#remove()}方法移除 * 1移除指定对象{@link Predicate#test(Object)}方法返回{@code true}的对象将被使用{@link Iterator#remove()}方法移除
* </pre> * </pre>
* *
* @param <T> 集合类型 * @param <T> 集合类型
* @param <E> 集合元素类型 * @param <E> 集合元素类型
* @param iter 集合 * @param iter 集合
* @param filter 过滤器接口 * @param predicate 过滤器接口
* @return 编辑后的集合 * @return 编辑后的集合
* @since 4.6.5 * @since 4.6.5
*/ */
public static <T extends Iterable<E>, E> T filter(final T iter, final Predicate<E> filter) { public static <T extends Iterable<E>, E> T remove(final T iter, final Predicate<E> predicate) {
if (null == iter) { if (null == iter) {
return null; return null;
} }
filter(iter.iterator(), filter); remove(iter.iterator(), predicate);
return iter; return iter;
} }
/** /**
* 过滤集合此方法在原集合上直接修改<br> * 移除集合中满足条件的所有元素此方法在原集合上直接修改<br>
* 通过实现Filter接口完成元素的过滤这个Filter实现可以实现以下功能 * 通过实现{@link Predicate}接口完成元素的移除可以实现以下功能
* *
* <pre> * <pre>
* 1过滤出需要的对象{@link Filter#accept(Object)}方法返回false的对象将被使用{@link Iterator#remove()}方法移除 * 1移除指定对象{@link Predicate#test(Object)}方法返回{@code true}的对象将被使用{@link Iterator#remove()}方法移除
* </pre> * </pre>
* *
* @param <E> 集合元素类型 * @param <E> 集合元素类型
* @param iter 集合 * @param iter 集合
* @param filter 过滤器接口删除{@link Filter#accept(Object)}{@code false}的元素 * @param predicate 过滤器接口删除{@link Predicate#test(Object)}{@code true}的元素
* @return 编辑后的集合 * @return 编辑后的集合
* @since 4.6.5 * @since 6.0.0
*/ */
public static <E> Iterator<E> filter(final Iterator<E> iter, final Predicate<E> filter) { public static <E> Iterator<E> remove(final Iterator<E> iter, final Predicate<E> predicate) {
if (null == iter || null == filter) { if (null == iter || null == predicate) {
return iter; return iter;
} }
while (iter.hasNext()) { while (iter.hasNext()) {
if (false == filter.test(iter.next())) { if (predicate.test(iter.next())) {
iter.remove(); iter.remove();
} }
} }

View File

@ -223,7 +223,7 @@ public class WordTree extends HashMap<Character, WordTree> {
*/ */
public List<String> matchAll(final String text, final int limit, final boolean isDensityMatch, final boolean isGreedMatch) { public List<String> matchAll(final String text, final int limit, final boolean isDensityMatch, final boolean isGreedMatch) {
final List<FoundWord> matchAllWords = matchAllWords(text, limit, isDensityMatch, isGreedMatch); final List<FoundWord> matchAllWords = matchAllWords(text, limit, isDensityMatch, isGreedMatch);
return CollUtil.map(matchAllWords, FoundWord::toString, true); return CollUtil.map(matchAllWords, FoundWord::toString);
} }
/** /**

View File

@ -2,6 +2,7 @@ package cn.hutool.core.collection;
import cn.hutool.core.comparator.ComparableComparator; import cn.hutool.core.comparator.ComparableComparator;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.map.Dict; import cn.hutool.core.map.Dict;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.text.StrUtil; import cn.hutool.core.text.StrUtil;
@ -253,7 +254,8 @@ public class CollUtilTest {
final Dict v2 = Dict.create().set("age", 13).set("id", 15).set("name", "李四"); final Dict v2 = Dict.create().set("age", 13).set("id", 15).set("name", "李四");
final ArrayList<Dict> list = ListUtil.of(v1, v2); final ArrayList<Dict> list = ListUtil.of(v1, v2);
final List<Object> fieldValues = CollUtil.getFieldValues(list, "name"); final List<Object> fieldValues = (List<Object>) CollUtil.getFieldValues(list, "name");
Assert.assertEquals("张三", fieldValues.get(0)); Assert.assertEquals("张三", fieldValues.get(0));
Assert.assertEquals("李四", fieldValues.get(1)); Assert.assertEquals("李四", fieldValues.get(1));
} }
@ -284,7 +286,7 @@ public class CollUtilTest {
} }
@Test @Test
public void filterTest() { public void editTest() {
final ArrayList<String> list = ListUtil.of("a", "b", "c"); final ArrayList<String> list = ListUtil.of("a", "b", "c");
final Collection<String> filtered = CollUtil.edit(list, t -> t + 1); final Collection<String> filtered = CollUtil.edit(list, t -> t + 1);
@ -293,10 +295,10 @@ public class CollUtilTest {
} }
@Test @Test
public void filterTest2() { public void removeTest() {
final ArrayList<String> list = ListUtil.of("a", "b", "c"); final ArrayList<String> list = ListUtil.of("a", "b", "c");
final ArrayList<String> filtered = CollUtil.filter(list, t -> false == "a".equals(t)); final ArrayList<String> filtered = CollUtil.remove(list, "a"::equals);
// 原地过滤 // 原地过滤
Assert.assertSame(list, filtered); Assert.assertSame(list, filtered);
@ -304,9 +306,9 @@ public class CollUtilTest {
} }
@Test @Test
public void filterSetTest() { public void removeForSetTest() {
final Set<String> set = SetUtil.ofLinked("a", "b", "", " ", "c"); final Set<String> set = SetUtil.ofLinked("a", "b", "", " ", "c");
final Set<String> filtered = CollUtil.filter(set, StrUtil::isNotBlank); final Set<String> filtered = CollUtil.remove(set, StrUtil::isBlank);
Assert.assertEquals(SetUtil.ofLinked("a", "b", "c"), filtered); Assert.assertEquals(SetUtil.ofLinked("a", "b", "c"), filtered);
} }
@ -316,12 +318,12 @@ public class CollUtilTest {
final ArrayList<String> list = ListUtil.of("a", "b", "c"); final ArrayList<String> list = ListUtil.of("a", "b", "c");
final List<String> removed = new ArrayList<>(); final List<String> removed = new ArrayList<>();
final ArrayList<String> filtered = CollUtil.filter(list, t -> { final ArrayList<String> filtered = CollUtil.remove(list, t -> {
if("a".equals(t)){ if("a".equals(t)){
removed.add(t); removed.add(t);
return false; return true;
} }
return true; return false;
}); });
Assert.assertEquals(1, removed.size()); Assert.assertEquals(1, removed.size());
@ -508,22 +510,6 @@ public class CollUtilTest {
Assert.assertEquals("D", str); Assert.assertEquals("D", str);
} }
@Test
public void addAllIfNotContainsTest() {
final ArrayList<String> list1 = new ArrayList<>();
list1.add("1");
list1.add("2");
final ArrayList<String> list2 = new ArrayList<>();
list2.add("2");
list2.add("3");
CollUtil.addAllIfNotContains(list1, list2);
Assert.assertEquals(3, list1.size());
Assert.assertEquals("1", list1.get(0));
Assert.assertEquals("2", list1.get(1));
Assert.assertEquals("3", list1.get(2));
}
@Test @Test
public void subInput1PositiveNegativePositiveOutput1() { public void subInput1PositiveNegativePositiveOutput1() {
// Arrange // Arrange
@ -916,4 +902,31 @@ public class CollUtilTest {
private String gender; private String gender;
private Integer id; private Integer id;
} }
@Test
public void mapTest(){
final ArrayList<String> list = ListUtil.of("a", "b", "c");
final List<Object> extract = CollUtil.map(list, (e) -> e + "_1");
Assert.assertEquals(ListUtil.of("a_1", "b_1", "c_1"), extract);
}
@Test
public void mapBeanTest(){
final List<Person> people = Arrays.asList(
new Person("aa", 12, "man", 1),
new Person("bb", 13, "woman", 2),
new Person("cc", 14, "man", 3),
new Person("dd", 15, "woman", 4)
);
final List<Object> extract = CollUtil.map(people, Person::getName);
Assert.assertEquals(ListUtil.of("aa", "bb", "cc", "dd"), extract);
}
@Test
public void createTest(){
final Collection<Object> collection = CollUtil.create(Collections.emptyList().getClass());
Console.log(collection.getClass());
Assert.assertNotNull(collection);
}
} }

View File

@ -108,11 +108,11 @@ public class IterUtilTest {
} }
@Test @Test
public void filterTest() { public void removeTest() {
final List<String> obj2 = ListUtil.of("3"); final List<String> obj2 = ListUtil.of("3");
final List<String> obj = ListUtil.of("1", "3"); final List<String> obj = ListUtil.of("1", "3");
IterUtil.filter(obj.iterator(), obj2::contains); IterUtil.remove(obj.iterator(), (e)-> false == obj2.contains(e));
Assert.assertEquals(1, obj.size()); Assert.assertEquals(1, obj.size());
Assert.assertEquals("3", obj.get(0)); Assert.assertEquals("3", obj.get(0));

View File

@ -232,4 +232,20 @@ public class ListUtilTest {
map = list.get(0); map = list.get(0);
Assert.assertEquals("李四", map.get("2")); Assert.assertEquals("李四", map.get("2"));
} }
@Test
public void addAllIfNotContainsTest() {
final ArrayList<String> list1 = new ArrayList<>();
list1.add("1");
list1.add("2");
final ArrayList<String> list2 = new ArrayList<>();
list2.add("2");
list2.add("3");
ListUtil.addAllIfNotContains(list1, list2);
Assert.assertEquals(3, list1.size());
Assert.assertEquals("1", list1.get(0));
Assert.assertEquals("2", list1.get(1));
Assert.assertEquals("3", list1.get(2));
}
} }

View File

@ -1,5 +1,6 @@
package cn.hutool.core.collection; package cn.hutool.core.collection;
import cn.hutool.core.util.RandomUtil;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
@ -7,7 +8,12 @@ public class MemorySafeLinkedBlockingQueueTest {
@Test @Test
public void offerTest(){ public void offerTest(){
final MemorySafeLinkedBlockingQueue<String> queue = new MemorySafeLinkedBlockingQueue<>(Integer.MAX_VALUE); // 设置初始值达到最大这样任何时候元素都无法加入队列
Assert.assertFalse(queue.offer("123")); final MemorySafeLinkedBlockingQueue<String> queue = new MemorySafeLinkedBlockingQueue<>(Long.MAX_VALUE);
Assert.assertFalse(queue.offer(RandomUtil.randomString(RandomUtil.randomInt(100))));
// 设定一个很小的值可以成功加入
queue.setMaxFreeMemory(10);
Assert.assertTrue(queue.offer(RandomUtil.randomString(RandomUtil.randomInt(100))));
} }
} }

View File

@ -1,6 +1,6 @@
package cn.hutool.cron.pattern.parser; package cn.hutool.cron.pattern.parser;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.date.Month; import cn.hutool.core.date.Month;
import cn.hutool.core.date.Week; import cn.hutool.core.date.Week;
import cn.hutool.core.math.NumberUtil; import cn.hutool.core.math.NumberUtil;
@ -104,7 +104,7 @@ public class PartParser {
final List<String> parts = StrUtil.split(value, StrUtil.C_COMMA); final List<String> parts = StrUtil.split(value, StrUtil.C_COMMA);
for (final String part : parts) { for (final String part : parts) {
CollUtil.addAllIfNotContains(values, parseStep(part)); ListUtil.addAllIfNotContains(values, parseStep(part));
} }
return values; return values;
} }

View File

@ -312,7 +312,7 @@ public class Sftp extends AbstractFtp {
if (CollUtil.isEmpty(entries)) { if (CollUtil.isEmpty(entries)) {
return ListUtil.empty(); return ListUtil.empty();
} }
return CollUtil.map(entries, LsEntry::getFilename, true); return CollUtil.map(entries, LsEntry::getFilename);
} }
/** /**

View File

@ -157,7 +157,7 @@ public class SshjSftp extends AbstractFtp {
throw new FtpException(e); throw new FtpException(e);
} }
if (CollUtil.isNotEmpty(infoList)) { if (CollUtil.isNotEmpty(infoList)) {
return CollUtil.map(infoList, RemoteResourceInfo::getName, true); return CollUtil.map(infoList, RemoteResourceInfo::getName);
} }
return null; return null;
} }