diff --git a/CHANGELOG.md b/CHANGELOG.md index a6d3f249b..ea59bd541 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,16 @@ ------------------------------------------------------------------------------------------------------------- -# 6.0.0.M1 (2022-04-28) +# 6.0.0.M1 (2022-06-03) + +### 计划实现 +* 【poi 】 PDF相关 +* 【poi 】 HTML、DOCX转换相关 +* 【poi 】 Markdown相关(如HTML转换等),基于commonmark-java +* 【core 】 针对JDK8+的日期,统一归档到TimeUtil +* 【core 】 CopyOptions参数重构 +* 【db 】 增加DDL封装 +* 【json 】 删除JSONNull ### ❌不兼容特性 diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/CombinationAnnotationElement.java b/hutool-core/src/main/java/cn/hutool/core/annotation/CombinationAnnotationElement.java index c68f2d27d..062e7ac11 100755 --- a/hutool-core/src/main/java/cn/hutool/core/annotation/CombinationAnnotationElement.java +++ b/hutool-core/src/main/java/cn/hutool/core/annotation/CombinationAnnotationElement.java @@ -1,6 +1,6 @@ package cn.hutool.core.annotation; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.SetUtil; import cn.hutool.core.map.TableMap; import java.io.Serializable; @@ -42,7 +42,7 @@ public class CombinationAnnotationElement implements AnnotatedElement, Serializa /** * 元注解 */ - private static final Set> META_ANNOTATIONS = CollUtil.newHashSet(Target.class, // + private static final Set> META_ANNOTATIONS = SetUtil.of(Target.class, // Retention.class, // Inherited.class, // Documented.class, // diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanPath.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanPath.java index a13280893..026b7e2d7 100644 --- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanPath.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanPath.java @@ -1,6 +1,7 @@ package cn.hutool.core.bean; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.map.MapUtil; import cn.hutool.core.text.StrUtil; @@ -10,7 +11,6 @@ import cn.hutool.core.util.CharUtil; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -67,7 +67,7 @@ public class BeanPath implements Serializable{ * @param expression 表达式 * @return BeanPath */ - public static BeanPath create(final String expression) { + public static BeanPath of(final String expression) { return new BeanPath(expression); } @@ -80,6 +80,15 @@ public class BeanPath implements Serializable{ init(expression); } + /** + * 获取表达式解析后的分段列表 + * + * @return 表达式分段列表 + */ + public List getPatternParts(){ + return this.patternParts; + } + /** * 获取Bean中对应表达式的值 * @@ -107,6 +116,12 @@ public class BeanPath implements Serializable{ set(bean, this.patternParts, value); } + @Override + public String toString() { + return this.patternParts.toString(); + } + + //region Private Methods /** * 设置表达式指定位置(或filed对应)的值
* 若表达式指向一个List则设置其坐标对应位置的值,若指向Map则put对应key的值,Bean则设置字段的值
@@ -131,7 +146,6 @@ public class BeanPath implements Serializable{ BeanUtil.setFieldValue(subBean, patternParts.get(patternParts.size() - 1), value); } - // ------------------------------------------------------------------------------------------------------------------------------------- Private method start /** * 获取Bean中对应表达式的值 * @@ -224,6 +238,7 @@ public class BeanPath implements Serializable{ final StringBuilder builder = new StringBuilder(); char c; boolean isNumStart = false;// 下标标识符开始 + boolean isInWrap = false; //标识是否在引号内 for (int i = 0; i < length; i++) { c = expression.charAt(i); if (0 == i && '$' == c) { @@ -232,7 +247,13 @@ public class BeanPath implements Serializable{ continue; } - if (ArrayUtil.contains(EXP_CHARS, c)) { + if('\'' == c){ + // 结束 + isInWrap = (false == isInWrap); + continue; + } + + if (false == isInWrap && ArrayUtil.contains(EXP_CHARS, c)) { // 处理边界符号 if (CharUtil.BRACKET_END == c) { // 中括号(数字下标)结束 @@ -252,7 +273,7 @@ public class BeanPath implements Serializable{ // 每一个边界符之前的表达式是一个完整的KEY,开始处理KEY } if (builder.length() > 0) { - localPatternParts.add(unWrapIfPossible(builder)); + localPatternParts.add(builder.toString()); } builder.setLength(0); } else { @@ -266,25 +287,12 @@ public class BeanPath implements Serializable{ throw new IllegalArgumentException(StrUtil.format("Bad expression '{}':{}, we find '[' but no ']' !", expression, length - 1)); } else { if (builder.length() > 0) { - localPatternParts.add(unWrapIfPossible(builder)); + localPatternParts.add(builder.toString()); } } // 不可变List - this.patternParts = Collections.unmodifiableList(localPatternParts); + this.patternParts = ListUtil.view(localPatternParts); } - - /** - * 对于非表达式去除单引号 - * - * @param expression 表达式 - * @return 表达式 - */ - private static String unWrapIfPossible(final CharSequence expression) { - if (StrUtil.containsAny(expression, " = ", " > ", " < ", " like ", ",")) { - return expression.toString(); - } - return StrUtil.unWrap(expression, '\''); - } - // ------------------------------------------------------------------------------------------------------------------------------------- Private method end + //endregion } diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java index 4061bd276..ccdb00b65 100755 --- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java @@ -4,6 +4,7 @@ import cn.hutool.core.bean.copier.BeanCopier; import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.bean.copier.ValueProvider; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.SetUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.func.Editor; import cn.hutool.core.map.CaseInsensitiveMap; @@ -340,7 +341,7 @@ public class BeanUtil { if (null == bean || StrUtil.isBlank(expression)) { return null; } - return (T) BeanPath.create(expression).get(bean); + return (T) BeanPath.of(expression).get(bean); } /** @@ -353,7 +354,7 @@ public class BeanUtil { * @since 4.0.6 */ public static void setProperty(final Object bean, final String expression, final Object value) { - BeanPath.create(expression).set(bean, value); + BeanPath.of(expression).set(bean, value); } // --------------------------------------------------------------------------------------------- mapToBean @@ -464,36 +465,6 @@ public class BeanUtil { return toBean(source, clazz, null); } - /** - * 对象或Map转Bean,忽略字段转换时发生的异常 - * - * @param 转换的Bean类型 - * @param source Bean对象或Map - * @param clazz 目标的Bean类型 - * @return Bean对象 - * @since 5.4.0 - */ - public static T toBeanIgnoreError(final Object source, final Class clazz) { - return toBean(source, clazz, CopyOptions.create().setIgnoreError(true)); - } - - /** - * 对象或Map转Bean,忽略字段转换时发生的异常 - * - * @param 转换的Bean类型 - * @param source Bean对象或Map - * @param clazz 目标的Bean类型 - * @param ignoreError 是否忽略注入错误 - * @return Bean对象 - * @since 5.4.0 - */ - public static T toBeanIgnoreCase(final Object source, final Class clazz, final boolean ignoreError) { - return toBean(source, clazz, - CopyOptions.create() - .setIgnoreCase(true) - .setIgnoreError(ignoreError)); - } - /** * 对象或Map转Bean * @@ -512,7 +483,7 @@ public class BeanUtil { * 对象或Map转Bean * * @param 转换的Bean类型 - * @param source Bean对象或Map + * @param source Bean对象或Map或{@link ValueProvider} * @param targetSupplier 目标的Bean创建器 * @param options 属性拷贝选项 * @return Bean对象 @@ -527,22 +498,6 @@ public class BeanUtil { return target; } - /** - * ServletRequest 参数转Bean - * - * @param Bean类型 - * @param beanClass Bean Class - * @param valueProvider 值提供者 - * @param copyOptions 拷贝选项,见 {@link CopyOptions} - * @return Bean - */ - public static T toBean(final Class beanClass, final ValueProvider valueProvider, final CopyOptions copyOptions) { - if (null == beanClass || null == valueProvider) { - return null; - } - return fillBean(ConstructorUtil.newInstanceIfPossible(beanClass), valueProvider, copyOptions); - } - /** * 填充Bean的核心方法 * @@ -559,7 +514,6 @@ public class BeanUtil { return BeanCopier.create(valueProvider, bean, copyOptions).copy(); } - // --------------------------------------------------------------------------------------------- beanToMap /** @@ -572,14 +526,16 @@ public class BeanUtil { * @since 5.8.0 */ public static Map beanToMap(final Object bean, final String... properties) { + int mapSize = 16; Editor keyEditor = null; - if(ArrayUtil.isNotEmpty(properties)){ - final Set propertiesSet = CollUtil.set(false, properties); + if (ArrayUtil.isNotEmpty(properties)) { + mapSize = properties.length; + final Set propertiesSet = SetUtil.of(properties); keyEditor = property -> propertiesSet.contains(property) ? property : null; } // 指明了要复制的属性 所以不忽略null值 - return beanToMap(bean, new LinkedHashMap<>(properties.length, 1), false, keyEditor); + return beanToMap(bean, new LinkedHashMap<>(mapSize, 1), false, keyEditor); } /** @@ -682,6 +638,9 @@ public class BeanUtil { * @return 目标对象 */ public static T copyProperties(final Object source, final Class tClass, final String... ignoreProperties) { + if (null == source) { + return null; + } final T target = ConstructorUtil.newInstanceIfPossible(tClass); copyProperties(source, target, CopyOptions.create().setIgnoreProperties(ignoreProperties)); return target; @@ -719,6 +678,9 @@ public class BeanUtil { * @param copyOptions 拷贝选项,见 {@link CopyOptions} */ public static void copyProperties(final Object source, final Object target, final CopyOptions copyOptions) { + if (null == source || null == target) { + return; + } BeanCopier.create(source, target, ObjUtil.defaultIfNull(copyOptions, CopyOptions::create)).copy(); } diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanCopier.java b/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanCopier.java index 162754eb7..35716d990 100755 --- a/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanCopier.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanCopier.java @@ -1,5 +1,6 @@ package cn.hutool.core.bean.copier; +import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.copier.Copier; import java.io.Serializable; @@ -16,9 +17,8 @@ import java.util.Map; * 4. Map 转 Map * * - * @author looly - * * @param 目标对象类型 + * @author looly * @since 3.2.3 */ public class BeanCopier implements Copier, Serializable { @@ -29,9 +29,9 @@ public class BeanCopier implements Copier, Serializable { /** * 创建BeanCopier * - * @param 目标Bean类型 - * @param source 来源对象,可以是Bean或者Map - * @param target 目标Bean对象 + * @param 目标Bean类型 + * @param source 来源对象,可以是Bean或者Map + * @param target 目标Bean对象 * @param copyOptions 拷贝属性选项 * @return BeanCopier */ @@ -42,10 +42,10 @@ public class BeanCopier implements Copier, Serializable { /** * 创建BeanCopier * - * @param 目标Bean类型 - * @param source 来源对象,可以是Bean或者Map - * @param target 目标Bean对象 - * @param destType 目标的泛型类型,用于标注有泛型参数的Bean对象 + * @param 目标Bean类型 + * @param source 来源对象,可以是Bean或者Map + * @param target 目标Bean对象 + * @param destType 目标的泛型类型,用于标注有泛型参数的Bean对象 * @param copyOptions 拷贝属性选项 * @return BeanCopier */ @@ -56,13 +56,15 @@ public class BeanCopier implements Copier, Serializable { /** * 构造 * - * @param source 来源对象,可以是Bean或者Map - * @param target 目标Bean对象 - * @param targetType 目标的泛型类型,用于标注有泛型参数的Bean对象 + * @param source 来源对象,可以是Bean或者Map,不能为{@code null} + * @param target 目标Bean对象,不能为{@code null} + * @param targetType 目标的泛型类型,用于标注有泛型参数的Bean对象 * @param copyOptions 拷贝属性选项 */ @SuppressWarnings("unchecked") public BeanCopier(final Object source, final T target, final Type targetType, final CopyOptions copyOptions) { + Assert.notNull(source, "Source bean must be not null!"); + Assert.notNull(target, "Target bean must be not null!"); final Copier copier; if (source instanceof Map) { if (target instanceof Map) { @@ -70,7 +72,7 @@ public class BeanCopier implements Copier, Serializable { } else { copier = new MapToBeanCopier<>((Map) source, target, targetType, copyOptions); } - }else if(source instanceof ValueProvider){ + } else if (source instanceof ValueProvider) { //noinspection unchecked copier = new ValueProviderToBeanCopier<>((ValueProvider) source, target, targetType, copyOptions); } else { diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/copier/MapToMapCopier.java b/hutool-core/src/main/java/cn/hutool/core/bean/copier/MapToMapCopier.java index c3dee2e92..a9cb20944 100755 --- a/hutool-core/src/main/java/cn/hutool/core/bean/copier/MapToMapCopier.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/copier/MapToMapCopier.java @@ -24,7 +24,7 @@ public class MapToMapCopier extends AbsCopier { * @param source 来源Map * @param target 目标Bean对象 * @param targetType 目标泛型类型 - * @param copyOptions 拷贝选项 + * @param copyOptions 拷贝选项,{@code null}使用默认配置 */ public MapToMapCopier(final Map source, final Map target, final Type targetType, final CopyOptions copyOptions) { super(source, target, copyOptions); diff --git a/hutool-core/src/main/java/cn/hutool/core/classloader/ClassLoaderUtil.java b/hutool-core/src/main/java/cn/hutool/core/classloader/ClassLoaderUtil.java index 3cd047857..c42529bc4 100644 --- a/hutool-core/src/main/java/cn/hutool/core/classloader/ClassLoaderUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/classloader/ClassLoaderUtil.java @@ -3,7 +3,7 @@ package cn.hutool.core.classloader; import cn.hutool.core.convert.BasicType; import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.lang.Assert; -import cn.hutool.core.lang.Pair; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.WeakConcurrentMap; import cn.hutool.core.text.CharPool; import cn.hutool.core.text.StrUtil; @@ -50,7 +50,7 @@ public class ClassLoaderUtil { * 原始类型名和其class对应表,例如:int =》 int.class */ private static final Map> PRIMITIVE_TYPE_NAME_MAP = new ConcurrentHashMap<>(32); - private static final WeakConcurrentMap, Class> CLASS_CACHE = new WeakConcurrentMap<>(); + private static final WeakConcurrentMap, Class> CLASS_CACHE = new WeakConcurrentMap<>(); static { final List> primitiveTypes = new ArrayList<>(32); @@ -202,7 +202,7 @@ public class ClassLoaderUtil { if (clazz == null) { final String finalName = name; final ClassLoader finalClassLoader = classLoader; - clazz = CLASS_CACHE.computeIfAbsent(Pair.of(name, classLoader), (key)-> doLoadClass(finalName, finalClassLoader, isInitialized)); + clazz = CLASS_CACHE.computeIfAbsent(MapUtil.entry(name, classLoader), (key)-> doLoadClass(finalName, finalClassLoader, isInitialized)); } return (Class) clazz; } diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java index 0a484dbd6..b5bfc2cb2 100755 --- a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java @@ -55,7 +55,6 @@ import java.util.TreeMap; import java.util.TreeSet; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; -import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.LinkedBlockingDeque; import java.util.function.BiConsumer; import java.util.function.Function; @@ -122,7 +121,7 @@ public class CollUtil { final ArrayList list = new ArrayList<>(Math.max(coll1.size(), coll2.size())); final Map map1 = countMap(coll1); final Map map2 = countMap(coll2); - final Set elts = newHashSet(coll2); + final Set elts = SetUtil.of(coll2); elts.addAll(coll1); int m; for (final T t : elts) { @@ -239,7 +238,7 @@ public class CollUtil { final ArrayList list = new ArrayList<>(Math.min(coll1.size(), coll2.size())); final Map map1 = countMap(coll1); final Map map2 = countMap(coll2); - final Set elts = newHashSet(coll2); + final Set elts = SetUtil.of(coll2); int m; for (final T t : elts) { m = Math.min(Convert.toInt(map1.get(t), 0), Convert.toInt(map2.get(t), 0)); @@ -348,7 +347,7 @@ public class CollUtil { final List result = new ArrayList<>(); final Map map1 = countMap(coll1); final Map map2 = countMap(coll2); - final Set elts = newHashSet(coll2); + final Set elts = SetUtil.of(coll2); elts.addAll(coll1); int m; for (final T t : elts) { @@ -401,7 +400,7 @@ public class CollUtil { return ListUtil.empty(); } if (isEmpty(coll2)) { - return ListUtil.list(true, coll1); + return ListUtil.of(true, coll1); } //将被交数用链表储存,防止因为频繁扩容影响性能 @@ -654,300 +653,6 @@ public class CollUtil { return currentAlaDatas; } - // ----------------------------------------------------------------------------------------------- new HashSet - - /** - * 新建一个HashSet - * - * @param 集合元素类型 - * @param ts 元素数组 - * @return HashSet对象 - */ - @SafeVarargs - public static HashSet newHashSet(final T... ts) { - return set(false, ts); - } - - /** - * 新建一个LinkedHashSet - * - * @param 集合元素类型 - * @param ts 元素数组 - * @return HashSet对象 - * @since 4.1.10 - */ - @SafeVarargs - public static LinkedHashSet newLinkedHashSet(final T... ts) { - return (LinkedHashSet) set(true, ts); - } - - /** - * 新建一个HashSet - * - * @param 集合元素类型 - * @param isSorted 是否有序,有序返回 {@link LinkedHashSet},否则返回 {@link HashSet} - * @param ts 元素数组 - * @return HashSet对象 - */ - @SafeVarargs - public static HashSet set(final boolean isSorted, final T... ts) { - if (null == ts) { - return isSorted ? new LinkedHashSet<>() : new HashSet<>(); - } - final int initialCapacity = Math.max((int) (ts.length / .75f) + 1, 16); - final HashSet set = isSorted ? new LinkedHashSet<>(initialCapacity) : new HashSet<>(initialCapacity); - Collections.addAll(set, ts); - return set; - } - - /** - * 新建一个HashSet - * - * @param 集合元素类型 - * @param collection 集合 - * @return HashSet对象 - */ - public static HashSet newHashSet(final Collection collection) { - return newHashSet(false, collection); - } - - /** - * 新建一个HashSet - * - * @param 集合元素类型 - * @param isSorted 是否有序,有序返回 {@link LinkedHashSet},否则返回{@link HashSet} - * @param collection 集合,用于初始化Set - * @return HashSet对象 - */ - public static HashSet newHashSet(final boolean isSorted, final Collection collection) { - return isSorted ? new LinkedHashSet<>(collection) : new HashSet<>(collection); - } - - /** - * 新建一个HashSet - * - * @param 集合元素类型 - * @param isSorted 是否有序,有序返回 {@link LinkedHashSet},否则返回{@link HashSet} - * @param iter {@link Iterator} - * @return HashSet对象 - * @since 3.0.8 - */ - public static HashSet newHashSet(final boolean isSorted, final Iterator iter) { - if (null == iter) { - return set(isSorted, (T[]) null); - } - final HashSet set = isSorted ? new LinkedHashSet<>() : new HashSet<>(); - while (iter.hasNext()) { - set.add(iter.next()); - } - return set; - } - - /** - * 新建一个HashSet - * - * @param 集合元素类型 - * @param isSorted 是否有序,有序返回 {@link LinkedHashSet},否则返回{@link HashSet} - * @param enumeration {@link Enumeration} - * @return HashSet对象 - * @since 3.0.8 - */ - public static HashSet newHashSet(final boolean isSorted, final Enumeration enumeration) { - if (null == enumeration) { - return set(isSorted, (T[]) null); - } - final HashSet set = isSorted ? new LinkedHashSet<>() : new HashSet<>(); - while (enumeration.hasMoreElements()) { - set.add(enumeration.nextElement()); - } - return set; - } - - // ----------------------------------------------------------------------------------------------- List - - /** - * 新建一个空List - * - * @param 集合元素类型 - * @param isLinked 是否新建LinkedList - * @return List对象 - * @since 4.1.2 - */ - public static List list(final boolean isLinked) { - return ListUtil.list(isLinked); - } - - /** - * 新建一个List - * - * @param 集合元素类型 - * @param isLinked 是否新建LinkedList - * @param values 数组 - * @return List对象 - * @since 4.1.2 - */ - @SafeVarargs - public static List list(final boolean isLinked, final T... values) { - return ListUtil.list(isLinked, values); - } - - /** - * 新建一个List - * - * @param 集合元素类型 - * @param isLinked 是否新建LinkedList - * @param collection 集合 - * @return List对象 - * @since 4.1.2 - */ - public static List list(final boolean isLinked, final Collection collection) { - return ListUtil.list(isLinked, collection); - } - - /** - * 新建一个List
- * 提供的参数为null时返回空{@link ArrayList} - * - * @param 集合元素类型 - * @param isLinked 是否新建LinkedList - * @param iterable {@link Iterable} - * @return List对象 - * @since 4.1.2 - */ - public static List list(final boolean isLinked, final Iterable iterable) { - return ListUtil.list(isLinked, iterable); - } - - /** - * 新建一个ArrayList
- * 提供的参数为null时返回空{@link ArrayList} - * - * @param 集合元素类型 - * @param isLinked 是否新建LinkedList - * @param iter {@link Iterator} - * @return ArrayList对象 - * @since 4.1.2 - */ - public static List list(final boolean isLinked, final Iterator iter) { - return ListUtil.list(isLinked, iter); - } - - /** - * 新建一个List
- * 提供的参数为null时返回空{@link ArrayList} - * - * @param 集合元素类型 - * @param isLinked 是否新建LinkedList - * @param enumeration {@link Enumeration} - * @return ArrayList对象 - * @since 3.0.8 - */ - public static List list(final boolean isLinked, final Enumeration enumeration) { - return ListUtil.list(isLinked, enumeration); - } - - /** - * 新建一个ArrayList - * - * @param 集合元素类型 - * @param values 数组 - * @return ArrayList对象 - * @see #toList(Object[]) - */ - @SafeVarargs - public static ArrayList newArrayList(final T... values) { - return ListUtil.toList(values); - } - - /** - * 数组转为ArrayList - * - * @param 集合元素类型 - * @param values 数组 - * @return ArrayList对象 - * @since 4.0.11 - */ - @SafeVarargs - public static ArrayList toList(final T... values) { - return ListUtil.toList(values); - } - - /** - * 新建一个ArrayList - * - * @param 集合元素类型 - * @param collection 集合 - * @return ArrayList对象 - */ - public static ArrayList newArrayList(final Collection collection) { - return ListUtil.toList(collection); - } - - /** - * 新建一个ArrayList
- * 提供的参数为null时返回空{@link ArrayList} - * - * @param 集合元素类型 - * @param iterable {@link Iterable} - * @return ArrayList对象 - * @since 3.1.0 - */ - public static ArrayList newArrayList(final Iterable iterable) { - return ListUtil.toList(iterable); - } - - /** - * 新建一个ArrayList
- * 提供的参数为null时返回空{@link ArrayList} - * - * @param 集合元素类型 - * @param iterator {@link Iterator} - * @return ArrayList对象 - * @since 3.0.8 - */ - public static ArrayList newArrayList(final Iterator iterator) { - return ListUtil.toList(iterator); - } - - /** - * 新建一个ArrayList
- * 提供的参数为null时返回空{@link ArrayList} - * - * @param 集合元素类型 - * @param enumeration {@link Enumeration} - * @return ArrayList对象 - * @since 3.0.8 - */ - public static ArrayList newArrayList(final Enumeration enumeration) { - return ListUtil.toList(enumeration); - } - - // ----------------------------------------------------------------------new LinkedList - - /** - * 新建LinkedList - * - * @param values 数组 - * @param 类型 - * @return LinkedList - * @since 4.1.2 - */ - @SafeVarargs - public static LinkedList newLinkedList(final T... values) { - return ListUtil.toLinkedList(values); - } - - /** - * 新建一个CopyOnWriteArrayList - * - * @param 集合元素类型 - * @param collection 集合 - * @return {@link CopyOnWriteArrayList} - */ - public static CopyOnWriteArrayList newCopyOnWriteArrayList(final Collection collection) { - return ListUtil.toCopyOnWriteArrayList(collection); - } - /** * 新建{@link BlockingQueue}
* 在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。 @@ -1125,7 +830,7 @@ public class CollUtil { return ListUtil.empty(); } - final List list = collection instanceof List ? (List) collection : ListUtil.toList(collection); + final List list = collection instanceof List ? (List) collection : ListUtil.of(collection); return sub(list, start, end, step); } @@ -1222,7 +927,7 @@ public class CollUtil { */ @SuppressWarnings("unchecked") public static , E> T removeAny(final T collection, final E... elesRemoved) { - collection.removeAll(newHashSet(elesRemoved)); + collection.removeAll(SetUtil.of(elesRemoved)); return collection; } @@ -1236,7 +941,7 @@ public class CollUtil { * @return 处理后的集合 * @since 4.6.5 */ - public static , E> T filter(final T collection, final Filter filter) { + public static , E> T filter(final T collection, final Predicate filter) { return IterUtil.filter(collection, filter); } @@ -1927,7 +1632,7 @@ public class CollUtil { * @since 3.0.9 */ public static Collection toCollection(final Iterable iterable) { - return (iterable instanceof Collection) ? (Collection) iterable : newArrayList(iterable.iterator()); + return (iterable instanceof Collection) ? (Collection) iterable : ListUtil.of(iterable.iterator()); } /** @@ -2082,7 +1787,7 @@ public class CollUtil { iter = StrUtil.splitTrim(ArrayStr, CharUtil.COMMA).iterator(); } else { // 其它类型按照单一元素处理 - iter = CollUtil.newArrayList(value).iterator(); + iter = ListUtil.of(value).iterator(); } final ConverterRegistry convert = ConverterRegistry.getInstance(); @@ -2522,14 +2227,14 @@ public class CollUtil { // ------------------------------------------------------------------------------------------------- forEach /** - * 循环遍历 {@link Iterable},使用{@link Consumer} 接受遍历的每条数据,并针对每条数据做处理 + * 循环遍历 {@link Iterable},使用{@link IndexedConsumer} 接受遍历的每条数据,并针对每条数据做处理 * * @param 集合元素类型 * @param iterable {@link Iterable} - * @param consumer {@link Consumer} 遍历的每条数据处理器 + * @param consumer {@link IndexedConsumer} 遍历的每条数据处理器 * @since 5.4.7 */ - public static void forEach(final Iterable iterable, final Consumer consumer) { + public static void forEach(final Iterable iterable, final IndexedConsumer consumer) { if (iterable == null) { return; } @@ -2537,13 +2242,13 @@ public class CollUtil { } /** - * 循环遍历 {@link Iterator},使用{@link Consumer} 接受遍历的每条数据,并针对每条数据做处理 + * 循环遍历 {@link Iterator},使用{@link IndexedConsumer} 接受遍历的每条数据,并针对每条数据做处理 * * @param 集合元素类型 * @param iterator {@link Iterator} - * @param consumer {@link Consumer} 遍历的每条数据处理器 + * @param consumer {@link IndexedConsumer} 遍历的每条数据处理器 */ - public static void forEach(final Iterator iterator, final Consumer consumer) { + public static void forEach(final Iterator iterator, final IndexedConsumer consumer) { if (iterator == null) { return; } @@ -2555,13 +2260,13 @@ public class CollUtil { } /** - * 循环遍历 {@link Enumeration},使用{@link Consumer} 接受遍历的每条数据,并针对每条数据做处理 + * 循环遍历 {@link Enumeration},使用{@link IndexedConsumer} 接受遍历的每条数据,并针对每条数据做处理 * * @param 集合元素类型 * @param enumeration {@link Enumeration} - * @param consumer {@link Consumer} 遍历的每条数据处理器 + * @param consumer {@link IndexedConsumer} 遍历的每条数据处理器 */ - public static void forEach(final Enumeration enumeration, final Consumer consumer) { + public static void forEach(final Enumeration enumeration, final IndexedConsumer consumer) { if (enumeration == null) { return; } @@ -2573,15 +2278,15 @@ public class CollUtil { } /** - * 循环遍历Map,使用{@link KVConsumer} 接受遍历的每条数据,并针对每条数据做处理
+ * 循环遍历Map,使用{@link IndexedKVConsumer} 接受遍历的每条数据,并针对每条数据做处理
* 和JDK8中的map.forEach不同的是,此方法支持index * * @param Key类型 * @param Value类型 * @param map {@link Map} - * @param kvConsumer {@link KVConsumer} 遍历的每条数据处理器 + * @param kvConsumer {@link IndexedKVConsumer} 遍历的每条数据处理器 */ - public static void forEach(final Map map, final KVConsumer kvConsumer) { + public static void forEach(final Map map, final IndexedKVConsumer kvConsumer) { if (map == null) { return; } @@ -2618,11 +2323,11 @@ public class CollUtil { while (result.size() - 1 < index) { result.add(null); } - result.set(index, newArrayList(t)); + result.set(index, ListUtil.of(t)); } else { subList = result.get(index); if (null == subList) { - result.set(index, newArrayList(t)); + result.set(index, ListUtil.of(t)); } else { subList.add(t); } @@ -2661,30 +2366,6 @@ public class CollUtil { }); } - /** - * 反序给定List,会在原List基础上直接修改 - * - * @param 元素类型 - * @param list 被反转的List - * @return 反转后的List - * @since 4.0.6 - */ - public static List reverse(final List list) { - return ListUtil.reverse(list); - } - - /** - * 反序给定List,会创建一个新的List,原List数据不变 - * - * @param 元素类型 - * @param list 被反转的List - * @return 反转后的List - * @since 4.0.6 - */ - public static List reverseNew(final List list) { - return ListUtil.reverseNew(list); - } - /** * 设置或增加元素。当index小于List的长度时,替换指定位置的值,否则在尾部追加 * @@ -2903,7 +2584,7 @@ public class CollUtil { * @author Looly */ @FunctionalInterface - public interface Consumer extends Serializable { + public interface IndexedConsumer extends Serializable { /** * 接受并处理一个参数 * @@ -2921,7 +2602,7 @@ public class CollUtil { * @author Looly */ @FunctionalInterface - public interface KVConsumer extends Serializable { + public interface IndexedKVConsumer extends Serializable { /** * 接受并处理一对参数 * diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/ConcurrentHashSet.java b/hutool-core/src/main/java/cn/hutool/core/collection/ConcurrentHashSet.java index 21dc35fb0..25f470ad3 100644 --- a/hutool-core/src/main/java/cn/hutool/core/collection/ConcurrentHashSet.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/ConcurrentHashSet.java @@ -1,8 +1,6 @@ package cn.hutool.core.collection; -import java.util.AbstractSet; import java.util.Collection; -import java.util.Iterator; import java.util.concurrent.ConcurrentHashMap; /** @@ -13,20 +11,16 @@ import java.util.concurrent.ConcurrentHashMap; * @param 元素类型 * @since 3.1.0 */ -public class ConcurrentHashSet extends AbstractSet implements java.io.Serializable { +public class ConcurrentHashSet extends SetFromMap { private static final long serialVersionUID = 7997886765361607470L; - /** 持有对象。如果值为此对象表示有数据,否则无数据 */ - private static final Boolean PRESENT = true; - private final ConcurrentHashMap map; - // ----------------------------------------------------------------------------------- Constructor start /** * 构造
* 触发因子为默认的0.75 */ public ConcurrentHashSet() { - map = new ConcurrentHashMap<>(); + super(new ConcurrentHashMap<>()); } /** @@ -36,7 +30,7 @@ public class ConcurrentHashSet extends AbstractSet implements java.io.Seri * @param initialCapacity 初始大小 */ public ConcurrentHashSet(final int initialCapacity) { - map = new ConcurrentHashMap<>(initialCapacity); + super(new ConcurrentHashMap<>(initialCapacity)); } /** @@ -46,7 +40,7 @@ public class ConcurrentHashSet extends AbstractSet implements java.io.Seri * @param loadFactor 加载因子。此参数决定数据增长时触发的百分比 */ public ConcurrentHashSet(final int initialCapacity, final float loadFactor) { - map = new ConcurrentHashMap<>(initialCapacity, loadFactor); + super(new ConcurrentHashMap<>(initialCapacity, loadFactor)); } /** @@ -57,7 +51,7 @@ public class ConcurrentHashSet extends AbstractSet implements java.io.Seri * @param concurrencyLevel 线程并发度 */ public ConcurrentHashSet(final int initialCapacity, final float loadFactor, final int concurrencyLevel) { - map = new ConcurrentHashMap<>(initialCapacity, loadFactor, concurrencyLevel); + super(new ConcurrentHashMap<>(initialCapacity, loadFactor, concurrencyLevel)); } /** @@ -65,52 +59,14 @@ public class ConcurrentHashSet extends AbstractSet implements java.io.Seri * @param iter {@link Iterable} */ public ConcurrentHashSet(final Iterable iter) { + super(iter instanceof Collection ? new ConcurrentHashMap<>((int)(((Collection)iter).size() / 0.75f)) : new ConcurrentHashMap<>()); if(iter instanceof Collection) { - final Collection collection = (Collection)iter; - map = new ConcurrentHashMap<>((int)(collection.size() / 0.75f)); - this.addAll(collection); + this.addAll((Collection)iter); }else { - map = new ConcurrentHashMap<>(); for (final E e : iter) { this.add(e); } } } // ----------------------------------------------------------------------------------- Constructor end - - @Override - public Iterator iterator() { - return map.keySet().iterator(); - } - - @Override - public int size() { - return map.size(); - } - - @Override - public boolean isEmpty() { - return map.isEmpty(); - } - - @Override - public boolean contains(final Object o) { - //noinspection SuspiciousMethodCalls - return map.containsKey(o); - } - - @Override - public boolean add(final E e) { - return map.put(e, PRESENT) == null; - } - - @Override - public boolean remove(final Object o) { - return PRESENT.equals(map.remove(o)); - } - - @Override - public void clear() { - map.clear(); - } } diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java index 88956bfc0..56b661c4f 100755 --- a/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java @@ -1,5 +1,6 @@ package cn.hutool.core.collection; +import cn.hutool.core.collection.iter.EnumerationIter; import cn.hutool.core.collection.partition.AvgPartition; import cn.hutool.core.collection.partition.Partition; import cn.hutool.core.collection.partition.RandomAccessAvgPartition; @@ -29,51 +30,53 @@ import java.util.function.Consumer; * @author looly */ public class ListUtil { - /** - * 新建一个空List - * - * @param 集合元素类型 - * @param isLinked 是否新建LinkedList - * @return List对象 - * @since 4.1.2 - */ - public static List list(final boolean isLinked) { - return isLinked ? new LinkedList<>() : new ArrayList<>(); - } /** - * 新建一个List + * 新建一个List
+ * 如果提供的初始化数组为空,新建默认初始长度的List * - * @param 集合元素类型 - * @param isLinked 是否新建LinkedList - * @param values 数组 + * @param 集合元素类型 + * @param values 数组,可以为{@code null} * @return List对象 * @since 4.1.2 */ @SafeVarargs - public static List list(final boolean isLinked, final T... values) { + public static ArrayList of(final T... values) { if (ArrayUtil.isEmpty(values)) { - return list(isLinked); + return new ArrayList<>(); } - final List arrayList = isLinked ? new LinkedList<>() : new ArrayList<>(values.length); + final ArrayList arrayList = new ArrayList<>(values.length); Collections.addAll(arrayList, values); return arrayList; } /** - * 新建一个List + * 新建一个{@link LinkedList}
+ * 如果提供的初始化数组为空,新建默认初始长度的List * - * @param 集合元素类型 - * @param isLinked 是否新建LinkedList - * @param collection 集合 - * @return List对象 - * @since 4.1.2 + * @param 集合元素类型 + * @param values 数组,可以为{@code null} + * @return {@link LinkedList}对象 */ - public static List list(final boolean isLinked, final Collection collection) { - if (null == collection) { - return list(isLinked); + @SafeVarargs + public static LinkedList ofLinked(final T... values) { + final LinkedList list = new LinkedList<>(); + if (ArrayUtil.isNotEmpty(values)) { + Collections.addAll(list, values); } - return isLinked ? new LinkedList<>(collection) : new ArrayList<>(collection); + return list; + } + + /** + * 新建一个List
+ * 如果提供的初始化数组为空,新建默认初始长度的List + * + * @param 集合元素类型 + * @param isLinked 是否为链表 + * @return List对象 + */ + public static List of(final boolean isLinked) { + return isLinked ? ofLinked() : of(); } /** @@ -86,31 +89,15 @@ public class ListUtil { * @return List对象 * @since 4.1.2 */ - public static List list(final boolean isLinked, final Iterable iterable) { + public static List of(final boolean isLinked, final Iterable iterable) { if (null == iterable) { - return list(isLinked); + return of(isLinked); } - return list(isLinked, iterable.iterator()); - } - - /** - * 新建一个List
- * 提供的参数为null时返回空{@link ArrayList} - * - * @param 集合元素类型 - * @param isLinked 是否新建LinkedList - * @param iter {@link Iterator} - * @return ArrayList对象 - * @since 4.1.2 - */ - public static List list(final boolean isLinked, final Iterator iter) { - final List list = list(isLinked); - if (null != iter) { - while (iter.hasNext()) { - list.add(iter.next()); - } + if (iterable instanceof Collection) { + final Collection collection = (Collection) iterable; + return isLinked ? new LinkedList<>(collection) : new ArrayList<>(collection); } - return list; + return of(isLinked, iterable.iterator()); } /** @@ -123,80 +110,30 @@ public class ListUtil { * @return ArrayList对象 * @since 3.0.8 */ - public static List list(final boolean isLinked, final Enumeration enumration) { - final List list = list(isLinked); - if (null != enumration) { - while (enumration.hasMoreElements()) { - list.add(enumration.nextElement()); + public static List of(final boolean isLinked, final Enumeration enumration) { + return of(isLinked, (Iterator) new EnumerationIter<>(enumration)); + } + + /** + * 新建一个List
+ * 提供的参数为null时返回空{@link ArrayList} + * + * @param 集合元素类型 + * @param isLinked 是否新建LinkedList + * @param iter {@link Iterator} + * @return ArrayList对象 + * @since 4.1.2 + */ + public static List of(final boolean isLinked, final Iterator iter) { + final List list = of(isLinked); + if (null != iter) { + while (iter.hasNext()) { + list.add(iter.next()); } } return list; } - /** - * 新建一个ArrayList - * - * @param 集合元素类型 - * @param values 数组 - * @return ArrayList对象 - */ - @SafeVarargs - public static ArrayList toList(final T... values) { - return (ArrayList) list(false, values); - } - - /** - * 新建LinkedList - * - * @param values 数组 - * @param 类型 - * @return LinkedList - * @since 4.1.2 - */ - @SafeVarargs - public static LinkedList toLinkedList(final T... values) { - return (LinkedList) list(true, values); - } - - /** - * 数组转为一个不可变List
- * 类似于Java9中的List.of - * - * @param ts 对象 - * @param 对象类型 - * @return 不可修改List - * @since 5.4.3 - */ - @SafeVarargs - public static List of(final T... ts) { - if (ArrayUtil.isEmpty(ts)) { - return Collections.emptyList(); - } - return Collections.unmodifiableList(toList(ts)); - } - - /** - * 新建一个CopyOnWriteArrayList - * - * @param 集合元素类型 - * @param collection 集合 - * @return {@link CopyOnWriteArrayList} - */ - public static CopyOnWriteArrayList toCopyOnWriteArrayList(final Collection collection) { - return (null == collection) ? (new CopyOnWriteArrayList<>()) : (new CopyOnWriteArrayList<>(collection)); - } - - /** - * 新建一个ArrayList - * - * @param 集合元素类型 - * @param collection 集合 - * @return ArrayList对象 - */ - public static ArrayList toList(final Collection collection) { - return (ArrayList) list(false, collection); - } - /** * 新建一个ArrayList
* 提供的参数为null时返回空{@link ArrayList} @@ -206,8 +143,8 @@ public class ListUtil { * @return ArrayList对象 * @since 3.1.0 */ - public static ArrayList toList(final Iterable iterable) { - return (ArrayList) list(false, iterable); + public static ArrayList of(final Iterable iterable) { + return (ArrayList) of(false, iterable); } /** @@ -219,8 +156,8 @@ public class ListUtil { * @return ArrayList对象 * @since 3.0.8 */ - public static ArrayList toList(final Iterator iterator) { - return (ArrayList) list(false, iterator); + public static ArrayList of(final Iterator iterator) { + return (ArrayList) of(false, iterator); } /** @@ -232,8 +169,71 @@ public class ListUtil { * @return ArrayList对象 * @since 3.0.8 */ - public static ArrayList toList(final Enumeration enumeration) { - return (ArrayList) list(false, enumeration); + public static ArrayList of(final Enumeration enumeration) { + return (ArrayList) of(false, enumeration); + } + + /** + * 数组转为一个不可变List
+ * 类似于Java9中的List.of + * + * @param ts 对象 + * @param 对象类型 + * @return 不可修改List + */ + @SafeVarargs + public static List view(final T... ts) { + return view(of(ts)); + } + + /** + * 转为一个不可变List
+ * 类似于Java9中的List.of + * + * @param ts 对象 + * @param 对象类型 + * @return 不可修改List,如果提供List为{@code null}或者空,返回{@link Collections#emptyList()} + */ + public static List view(final List ts) { + if (ArrayUtil.isEmpty(ts)) { + return empty(); + } + return Collections.unmodifiableList(ts); + } + + /** + * 获取一个空List,这个空List不可变 + * + * @param 元素类型 + * @return 空的List + * @see Collections#emptyList() + * @since 5.2.6 + */ + public static List empty() { + return Collections.emptyList(); + } + + /** + * 新建一个CopyOnWriteArrayList + * + * @param 集合元素类型 + * @param collection 集合 + * @return {@link CopyOnWriteArrayList} + */ + public static CopyOnWriteArrayList ofCopyOnWrite(final Collection collection) { + return (null == collection) ? (new CopyOnWriteArrayList<>()) : (new CopyOnWriteArrayList<>(collection)); + } + + /** + * 新建一个CopyOnWriteArrayList + * + * @param 集合元素类型 + * @param ts 集合 + * @return {@link CopyOnWriteArrayList} + */ + @SafeVarargs + public static CopyOnWriteArrayList ofCopyOnWrite(final T... ts) { + return (null == ts) ? (new CopyOnWriteArrayList<>()) : (new CopyOnWriteArrayList<>(ts)); } /** @@ -255,7 +255,7 @@ public class ListUtil { // 每页条目数大于总数直接返回所有 if (resultSize <= pageSize) { if (pageNo < (PageUtil.getFirstPageNo() + 1)) { - return unmodifiable(list); + return view(list); } else { // 越界直接返回空 return new ArrayList<>(0); @@ -500,33 +500,6 @@ public class ListUtil { return CollUtil.indexOfAll(list, matcher); } - /** - * 将对应List转换为不可修改的List - * - * @param list List - * @param 元素类型 - * @return 不可修改List - * @since 5.2.6 - */ - public static List unmodifiable(final List list) { - if (null == list) { - return null; - } - return Collections.unmodifiableList(list); - } - - /** - * 获取一个空List,这个空List不可变 - * - * @param 元素类型 - * @return 空的List - * @see Collections#emptyList() - * @since 5.2.6 - */ - public static List empty() { - return Collections.emptyList(); - } - /** * 通过传入分区长度,将指定列表分区为不同的块,每块区域的长度相同(最后一块可能小于长度)
* 分区是在原List的基础上进行的,返回的分区是不可变的抽象列表,原列表元素变更,分区中元素也会变更。 diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/SetFromMap.java b/hutool-core/src/main/java/cn/hutool/core/collection/SetFromMap.java new file mode 100644 index 000000000..d4fd92eee --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/collection/SetFromMap.java @@ -0,0 +1,139 @@ +package cn.hutool.core.collection; + +import java.io.IOException; +import java.io.Serializable; +import java.util.AbstractSet; +import java.util.Collection; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.Spliterator; +import java.util.function.Consumer; +import java.util.function.Predicate; +import java.util.stream.Stream; + +/** + * 基于Map的Set实现 + * + * @param 元素类型 + * @author guava + */ +public class SetFromMap extends AbstractSet implements Serializable { + private static final long serialVersionUID = 1L; + + private final Map m; // The backing map + private transient Set s; // Its keySet + + public SetFromMap(final Map map) { + m = map; + s = map.keySet(); + } + + @Override + public void clear() { + m.clear(); + } + + @Override + public int size() { + return m.size(); + } + + @Override + public boolean isEmpty() { + return m.isEmpty(); + } + + @SuppressWarnings("SuspiciousMethodCalls") + @Override + public boolean contains(final Object o) { + return m.containsKey(o); + } + + @Override + public boolean remove(final Object o) { + return m.remove(o) != null; + } + + @Override + public boolean add(final E e) { + return m.put(e, Boolean.TRUE) == null; + } + + @Override + public Iterator iterator() { + return s.iterator(); + } + + @Override + public Object[] toArray() { + return s.toArray(); + } + + @SuppressWarnings("SuspiciousToArrayCall") + @Override + public T[] toArray(final T[] a) { + return super.toArray(a); + } + + @Override + public String toString() { + return s.toString(); + } + + @Override + public int hashCode() { + return s.hashCode(); + } + + @SuppressWarnings("EqualsWhichDoesntCheckParameterClass") + @Override + public boolean equals(final Object o) { + return o == this || s.equals(o); + } + + @Override + public boolean containsAll(final Collection c) { + return s.containsAll(c); + } + + @Override + public boolean removeAll(final Collection c) { + return s.removeAll(c); + } + + @Override + public boolean retainAll(final Collection c) { + return s.retainAll(c); + } + + @Override + public void forEach(final Consumer action) { + s.forEach(action); + } + + @Override + public boolean removeIf(final Predicate filter) { + return s.removeIf(filter); + } + + @Override + public Spliterator spliterator() { + return s.spliterator(); + } + + @Override + public Stream stream() { + return s.stream(); + } + + @Override + public Stream parallelStream() { + return s.parallelStream(); + } + + private void readObject(final java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException { + stream.defaultReadObject(); + s = m.keySet(); + } +} diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/SetUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/SetUtil.java new file mode 100644 index 000000000..a80396d6e --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/collection/SetUtil.java @@ -0,0 +1,195 @@ +package cn.hutool.core.collection; + +import cn.hutool.core.util.ArrayUtil; + +import java.util.Collection; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; + +/** + * 集合中的{@link java.util.Set}相关方法封装 + * + * @author looly + */ +public class SetUtil { + + /** + * 新建一个List
+ * 如果提供的初始化数组为空,新建默认初始长度的List + * + * @param 集合元素类型 + * @param isLinked 是否为链表 + * @return List对象 + */ + public static HashSet of(final boolean isLinked) { + return _of(isLinked, null); + } + + /** + * 新建一个HashSet + * + * @param 集合元素类型 + * @param ts 元素数组 + * @return HashSet对象 + */ + @SafeVarargs + public static HashSet of(final T... ts) { + return _of(false, ts); + } + + /** + * 新建一个LinkedHashSet + * + * @param 集合元素类型 + * @param ts 元素数组 + * @return HashSet对象 + * @since 4.1.10 + */ + @SafeVarargs + public static LinkedHashSet ofLinked(final T... ts) { + return (LinkedHashSet) _of(true, ts); + } + + /** + * 新建一个HashSet + * + * @param 集合元素类型 + * @param iterable 集合 + * @return HashSet对象 + */ + public static HashSet of(final Iterable iterable) { + return of(false, iterable); + } + + /** + * 新建一个HashSet
+ * 提供的参数为null时返回空{@link HashSet} + * + * @param 集合元素类型 + * @param isLinked 是否新建LinkedList + * @param iterable {@link Iterable} + * @return HashSet对象 + */ + public static HashSet of(final boolean isLinked, final Iterable iterable) { + if (null == iterable) { + return of(isLinked); + } + if (iterable instanceof Collection) { + final Collection collection = (Collection) iterable; + return isLinked ? new LinkedHashSet<>(collection) : new HashSet<>(collection); + } + return of(isLinked, iterable.iterator()); + } + + /** + * 新建一个HashSet + * + * @param 集合元素类型 + * @param isSorted 是否有序,有序返回 {@link LinkedHashSet},否则返回{@link HashSet} + * @param iter {@link Iterator} + * @return HashSet对象 + * @since 3.0.8 + */ + public static HashSet of(final boolean isSorted, final Iterator iter) { + if (null == iter) { + return _of(isSorted, null); + } + final HashSet set = isSorted ? new LinkedHashSet<>() : new HashSet<>(); + while (iter.hasNext()) { + set.add(iter.next()); + } + return set; + } + + /** + * 新建一个HashSet + * + * @param 集合元素类型 + * @param isLinked 是否有序,有序返回 {@link LinkedHashSet},否则返回{@link HashSet} + * @param enumeration {@link Enumeration} + * @return HashSet对象 + * @since 3.0.8 + */ + public static HashSet of(final boolean isLinked, final Enumeration enumeration) { + if (null == enumeration) { + return _of(isLinked, null); + } + final HashSet set = isLinked ? new LinkedHashSet<>() : new HashSet<>(); + while (enumeration.hasMoreElements()) { + set.add(enumeration.nextElement()); + } + return set; + } + + /** + * 新建一个SetFromMap + * + * @param 集合元素类型 + * @param map Map + * @return SetFromMap对象 + */ + public static SetFromMap of(final Map map) { + return new SetFromMap<>(map); + } + + /** + * 数组转为一个不可变List
+ * 类似于Java9中的List.of + * + * @param ts 对象 + * @param 对象类型 + * @return 不可修改List + */ + @SafeVarargs + public static Set view(final T... ts) { + return view(of(ts)); + } + + /** + * 转为一个不可变Set + * + * @param ts 对象 + * @param 对象类型 + * @return 不可修改List,如果提供List为{@code null}或者空,返回{@link Collections#emptySet()} + */ + public static Set view(final Set ts) { + if (ArrayUtil.isEmpty(ts)) { + return empty(); + } + return Collections.unmodifiableSet(ts); + } + + /** + * 获取一个空Set,这个空Set不可变 + * + * @param 元素类型 + * @return 空的List + * @see Collections#emptySet() + */ + public static Set empty() { + return Collections.emptySet(); + } + + /** + * 新建一个HashSet + * + * @param 集合元素类型 + * @param isLinked 是否有序,有序返回 {@link LinkedHashSet},否则返回 {@link HashSet} + * @param ts 元素数组 + * @return HashSet对象 + */ + private static HashSet _of(final boolean isLinked, final T[] ts) { + if (ArrayUtil.isEmpty(ts)) { + return isLinked ? new LinkedHashSet<>() : new HashSet<>(); + } + final int initialCapacity = Math.max((int) (ts.length / .75f) + 1, 16); + final HashSet set = isLinked ? new LinkedHashSet<>(initialCapacity) : new HashSet<>(initialCapacity); + Collections.addAll(set, ts); + return set; + } +} diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/iter/CopiedIter.java b/hutool-core/src/main/java/cn/hutool/core/collection/iter/CopiedIter.java index 328e8d6c4..389a2fff3 100644 --- a/hutool-core/src/main/java/cn/hutool/core/collection/iter/CopiedIter.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/iter/CopiedIter.java @@ -44,7 +44,7 @@ public class CopiedIter implements IterableIter, Serializable { * @param iterator 被复制的Iterator */ public CopiedIter(final Iterator iterator) { - final List eleList = ListUtil.toList(iterator); + final List eleList = ListUtil.of(iterator); this.listIterator = eleList.iterator(); } diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/iter/IterUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/iter/IterUtil.java index 233f1766f..ec3c0d9fa 100644 --- a/hutool-core/src/main/java/cn/hutool/core/collection/iter/IterUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/iter/IterUtil.java @@ -519,7 +519,7 @@ public class IterUtil { * @since 4.0.6 */ public static List toList(final Iterator iter) { - return ListUtil.toList(iter); + return ListUtil.of(iter); } /** @@ -710,7 +710,7 @@ public class IterUtil { * @return 编辑后的集合 * @since 4.6.5 */ - public static , E> T filter(final T iter, final Filter filter) { + public static , E> T filter(final T iter, final Predicate filter) { if (null == iter) { return null; } @@ -734,13 +734,13 @@ public class IterUtil { * @return 编辑后的集合 * @since 4.6.5 */ - public static Iterator filter(final Iterator iter, final Filter filter) { + public static Iterator filter(final Iterator iter, final Predicate filter) { if (null == iter || null == filter) { return iter; } while (iter.hasNext()) { - if (false == filter.accept(iter.next())) { + if (false == filter.test(iter.next())) { iter.remove(); } } diff --git a/hutool-core/src/main/java/cn/hutool/core/compiler/JavaFileObjectUtil.java b/hutool-core/src/main/java/cn/hutool/core/compiler/JavaFileObjectUtil.java index 36915e712..7e06b3011 100644 --- a/hutool-core/src/main/java/cn/hutool/core/compiler/JavaFileObjectUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/compiler/JavaFileObjectUtil.java @@ -1,7 +1,10 @@ package cn.hutool.core.compiler; +import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.file.FileNameUtil; import cn.hutool.core.compress.ZipUtil; +import cn.hutool.core.io.resource.FileResource; +import cn.hutool.core.io.resource.Resource; import javax.tools.JavaFileObject; import java.io.File; @@ -17,26 +20,59 @@ import java.util.zip.ZipFile; */ public class JavaFileObjectUtil { + /** + * 获取指定资源下的所有待编译的java源码文件,并以{@link JavaFileObject}形式返回 + *
    + *
  • 如果资源为目录,则遍历目录找到目录中的.java或者.jar等文件加载之
  • + *
  • 如果资源为.jar或.zip等,解压读取其中的.java文件加载之
  • + *
  • 其他情况直接读取资源流并加载之
  • + *
+ * + * @param resource 资源,可以为目录、文件或流 + * @return 所有待编译的 {@link JavaFileObject} + */ + public static List getJavaFileObjects(final Resource resource) { + final List result = new ArrayList<>(); + + if (resource instanceof FileResource) { + final File file = ((FileResource) resource).getFile(); + result.addAll(JavaFileObjectUtil.getJavaFileObjects(file)); + } else { + result.add(new JavaSourceFileObject(resource.getName(), resource.getStream())); + } + + return result; + } + /** * 获取指定文件下的所有待编译的java文件,并以{@link JavaFileObject}形式返回 + *
    + *
  • 如果文件为目录,则遍历目录找到目录中的.java或者.jar等文件加载之
  • + *
  • 如果文件为.jar或.zip等,解压读取其中的.java文件加载之
  • + *
* * @param file 文件或目录,文件支持.java、.jar和.zip文件 * @return 所有待编译的 {@link JavaFileObject} */ public static List getJavaFileObjects(final File file) { final List result = new ArrayList<>(); - final String fileName = file.getName(); - - if (isJavaFile(fileName)) { - result.add(new JavaSourceFileObject(file.toURI())); - } else if (isJarOrZipFile(fileName)) { - result.addAll(getJavaFileObjectByZipOrJarFile(file)); + if (file.isDirectory()) { + FileUtil.walkFiles(file, (subFile) -> result.addAll(getJavaFileObjects(file))); + } else { + final String fileName = file.getName(); + if (isJavaFile(fileName)) { + result.add(new JavaSourceFileObject(file.toURI())); + } else if (isJarOrZipFile(fileName)) { + result.addAll(getJavaFileObjectByZipOrJarFile(file)); + } } + return result; } /** - * 是否是jar 或 zip 文件 + * 是否是jar 或 zip 文件
+ * 通过扩展名判定 * * @param fileName 文件名 * @return 是否是jar 或 zip 文件 @@ -46,7 +82,8 @@ public class JavaFileObjectUtil { } /** - * 是否是java文件 + * 是否是java文件
+ * 通过扩展名判定 * * @param fileName 文件名 * @return 是否是.java文件 diff --git a/hutool-core/src/main/java/cn/hutool/core/compiler/JavaSourceCompiler.java b/hutool-core/src/main/java/cn/hutool/core/compiler/JavaSourceCompiler.java index ac9b71c87..7b8b6dbc5 100644 --- a/hutool-core/src/main/java/cn/hutool/core/compiler/JavaSourceCompiler.java +++ b/hutool-core/src/main/java/cn/hutool/core/compiler/JavaSourceCompiler.java @@ -1,5 +1,6 @@ package cn.hutool.core.compiler; +import cn.hutool.core.classloader.ClassLoaderUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IoUtil; @@ -7,11 +8,9 @@ import cn.hutool.core.io.resource.FileResource; import cn.hutool.core.io.resource.Resource; import cn.hutool.core.io.resource.StringResource; import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.core.classloader.ClassLoaderUtil; -import cn.hutool.core.util.ObjUtil; import cn.hutool.core.net.URLUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjUtil; import javax.tools.DiagnosticCollector; import javax.tools.JavaCompiler.CompilationTask; @@ -22,11 +21,8 @@ import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; /** * Java 源码编译器 @@ -230,40 +226,9 @@ public class JavaSourceCompiler { final List list = new ArrayList<>(); for (final Resource resource : this.sourceList) { - if (resource instanceof FileResource) { - final File file = ((FileResource) resource).getFile(); - FileUtil.walkFiles(file, (subFile) -> list.addAll(JavaFileObjectUtil.getJavaFileObjects(file))); - } else { - list.add(new JavaSourceFileObject(resource.getName(), resource.getStream())); - } + list.addAll(JavaFileObjectUtil.getJavaFileObjects(resource)); } return list; } - - /** - * 通过源码Map获得Java文件对象 - * - * @param sourceCodeMap 源码Map - * @return Java文件对象集合 - */ - private Collection getJavaFileObjectByMap(final Map sourceCodeMap) { - if (MapUtil.isNotEmpty(sourceCodeMap)) { - return sourceCodeMap.entrySet().stream() - .map(entry -> new JavaSourceFileObject(entry.getKey(), entry.getValue(), CharsetUtil.UTF_8)) - .collect(Collectors.toList()); - } - return Collections.emptySet(); - } - - /** - * 通过.java文件创建Java文件对象 - * - * @param file .java文件 - * @return Java文件对象 - */ - private JavaFileObject getJavaFileObjectByJavaFile(final File file) { - return new JavaSourceFileObject(file.toURI()); - } - } diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/AbstractConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/AbstractConverter.java index 45bad14c7..c66d4f247 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/AbstractConverter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/AbstractConverter.java @@ -1,9 +1,9 @@ package cn.hutool.core.convert; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.CharUtil; import cn.hutool.core.reflect.ClassUtil; import cn.hutool.core.text.StrUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.CharUtil; import java.io.Serializable; import java.util.Map; diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/CastUtil.java b/hutool-core/src/main/java/cn/hutool/core/convert/CastUtil.java new file mode 100644 index 000000000..482de45c1 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/convert/CastUtil.java @@ -0,0 +1,113 @@ +package cn.hutool.core.convert; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * 转换工具类,提供集合、Map等向上向下转换工具 + * + * @author feg545 + * @since 5.8.1 + */ +public class CastUtil { + + /** + * 泛型集合向上转型。例如将Collection<Integer>转换为Collection<Number> + * + * @param collection 集合 + * @param 元素类型 + * @return 转换后的集合 + */ + @SuppressWarnings("unchecked") + public static Collection castUp(Collection collection) { + return (Collection) collection; + } + + /** + * 泛型集合向下转型。例如将Collection<Number>转换为Collection<Integer> + * + * @param collection 集合 + * @param 元素类型 + * @return 转换后的集合 + */ + @SuppressWarnings("unchecked") + public static Collection castDown(Collection collection) { + return (Collection) collection; + } + + /** + * 泛型集合向上转型。例如将Set<Integer>转换为Set<Number> + * + * @param set 集合 + * @param 泛型 + * @return 泛化集合 + */ + @SuppressWarnings("unchecked") + public static Set castUp(Set set) { + return (Set) set; + } + + /** + * 泛型集合向下转型。例如将Set<Number>转换为Set<Integer> + * + * @param set 集合 + * @param 泛型子类 + * @return 泛化集合 + */ + @SuppressWarnings("unchecked") + public static Set castDown(Set set) { + return (Set) set; + } + + /** + * 泛型接口向上转型。例如将List<Integer>转换为List<Number> + * + * @param list 集合 + * @param 泛型的父类 + * @return 泛化集合 + */ + @SuppressWarnings("unchecked") + public static List castUp(List list) { + return (List) list; + } + + /** + * 泛型集合向下转型。例如将List<Number>转换为List<Integer> + * + * @param list 集合 + * @param 泛型的子类 + * @return 泛化集合 + */ + @SuppressWarnings("unchecked") + public static List castDown(List list) { + return (List) list; + } + + /** + * 泛型集合向下转型。例如将Map<Integer, Integer>转换为Map<Number,Number> + * + * @param map 集合 + * @param 泛型父类 + * @param 泛型父类 + * @return 泛化集合 + */ + @SuppressWarnings("unchecked") + public static Map castUp(Map map) { + return (Map) map; + } + + /** + * 泛型集合向下转型。例如将Map<Number,Number>转换为Map<Integer, Integer> + * + * @param map 集合 + * @param 泛型子类 + * @param 泛型子类 + * @return 泛化集合 + */ + @SuppressWarnings("unchecked") + public static Map castDown(Map map) { + return (Map) map; + } +} diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/ConverterRegistry.java b/hutool-core/src/main/java/cn/hutool/core/convert/ConverterRegistry.java index d59cb62fe..79e169b49 100755 --- a/hutool-core/src/main/java/cn/hutool/core/convert/ConverterRegistry.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/ConverterRegistry.java @@ -258,6 +258,7 @@ public class ConverterRegistry implements Serializable { return converter.convert(value, defaultValue); } + Class rowType = (Class) TypeUtil.getClass(type); if (null == rowType) { if (null != defaultValue) { diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/NumberWordFormatter.java b/hutool-core/src/main/java/cn/hutool/core/convert/NumberWordFormatter.java index 12c3853c6..98a42240c 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/NumberWordFormatter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/NumberWordFormatter.java @@ -63,7 +63,7 @@ public class NumberWordFormatter { int index = -1; double res = value; while (res > 10 && (false == isTwo || index < 1)) { - if (res > 1000) { + if (res >= 1000) { res = res / 1000; index++; } diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/TemporalAccessorConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/TemporalAccessorConverter.java index 5ab61d751..131095721 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/impl/TemporalAccessorConverter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/impl/TemporalAccessorConverter.java @@ -3,8 +3,8 @@ package cn.hutool.core.convert.impl; import cn.hutool.core.convert.AbstractConverter; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.ObjUtil; import cn.hutool.core.text.StrUtil; +import cn.hutool.core.util.ObjUtil; import java.time.Instant; import java.time.LocalDate; @@ -84,6 +84,12 @@ public class TemporalAccessorConverter extends AbstractConverter getTargetType() { + return (Class) this.targetType; + } + @Override protected TemporalAccessor convertInternal(final Object value) { if (value instanceof Long) { diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java index 683e314de..116a763ad 100755 --- a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java @@ -1,17 +1,17 @@ package cn.hutool.core.date; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.comparator.CompareUtil; import cn.hutool.core.date.format.DateParser; import cn.hutool.core.date.format.DatePrinter; import cn.hutool.core.date.format.FastDateFormat; import cn.hutool.core.date.format.GlobalCustomFormat; import cn.hutool.core.lang.Assert; -import cn.hutool.core.regex.PatternPool; -import cn.hutool.core.util.CharUtil; import cn.hutool.core.math.NumberUtil; +import cn.hutool.core.regex.PatternPool; import cn.hutool.core.regex.ReUtil; import cn.hutool.core.text.StrUtil; +import cn.hutool.core.util.CharUtil; import java.text.DateFormat; import java.text.SimpleDateFormat; @@ -20,7 +20,14 @@ import java.time.LocalDateTime; import java.time.Year; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAccessor; -import java.util.*; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Date; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Locale; +import java.util.TimeZone; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; import java.util.function.Function; @@ -1842,8 +1849,8 @@ public class DateUtil extends CalendarUtil { * @since 5.7.21 */ public static List rangeContains(final DateRange start, final DateRange end) { - final List startDateTimes = CollUtil.newArrayList((Iterable) start); - final List endDateTimes = CollUtil.newArrayList((Iterable) end); + final List startDateTimes = ListUtil.of((Iterable) start); + final List endDateTimes = ListUtil.of((Iterable) end); return startDateTimes.stream().filter(endDateTimes::contains).collect(Collectors.toList()); } @@ -1857,8 +1864,8 @@ public class DateUtil extends CalendarUtil { * @since 5.7.21 */ public static List rangeNotContains(final DateRange start, final DateRange end) { - final List startDateTimes = CollUtil.newArrayList((Iterable) start); - final List endDateTimes = CollUtil.newArrayList((Iterable) end); + final List startDateTimes = ListUtil.of((Iterable) start); + final List endDateTimes = ListUtil.of((Iterable) end); return endDateTimes.stream().filter(item -> !startDateTimes.contains(item)).collect(Collectors.toList()); } @@ -1909,7 +1916,7 @@ public class DateUtil extends CalendarUtil { * @return {@link DateRange} */ public static List rangeToList(final Date start, final Date end, final DateField unit) { - return CollUtil.newArrayList((Iterable) range(start, end, unit)); + return ListUtil.of((Iterable) range(start, end, unit)); } /** @@ -1923,7 +1930,7 @@ public class DateUtil extends CalendarUtil { * @since 5.7.16 */ public static List rangeToList(final Date start, final Date end, final DateField unit, final int step) { - return CollUtil.newArrayList((Iterable) new DateRange(start, end, unit, step)); + return ListUtil.of((Iterable) new DateRange(start, end, unit, step)); } /** diff --git a/hutool-core/src/main/java/cn/hutool/core/date/chinese/LunarFestival.java b/hutool-core/src/main/java/cn/hutool/core/date/chinese/LunarFestival.java index 71b41f1f3..f5d48c9f6 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/chinese/LunarFestival.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/chinese/LunarFestival.java @@ -1,9 +1,10 @@ package cn.hutool.core.date.chinese; -import cn.hutool.core.lang.Pair; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.TableMap; import java.util.List; +import java.util.Map; /** * 节假日(农历)封装 @@ -15,72 +16,72 @@ public class LunarFestival { //农历节日 *表示放假日 // 来自:https://baike.baidu.com/item/%E4%B8%AD%E5%9B%BD%E4%BC%A0%E7%BB%9F%E8%8A%82%E6%97%A5/396100 - private static final TableMap, String> L_FTV = new TableMap<>(16); + private static final TableMap, String> L_FTV = new TableMap<>(16); static { // 节日 - L_FTV.put(new Pair<>(1, 1), "春节"); - L_FTV.put(new Pair<>(1, 2), "犬日"); - L_FTV.put(new Pair<>(1, 3), "猪日"); - L_FTV.put(new Pair<>(1, 4), "羊日"); - L_FTV.put(new Pair<>(1, 5), "牛日 破五日"); - L_FTV.put(new Pair<>(1, 6), "马日 送穷日"); - L_FTV.put(new Pair<>(1, 7), "人日 人胜节"); - L_FTV.put(new Pair<>(1, 8), "谷日 八仙日"); - L_FTV.put(new Pair<>(1, 9), "天日 九皇会"); - L_FTV.put(new Pair<>(1, 10), "地日 石头生日"); - L_FTV.put(new Pair<>(1, 12), "火日 老鼠娶媳妇日"); - L_FTV.put(new Pair<>(1, 13), "上(试)灯日 关公升天日"); - L_FTV.put(new Pair<>(1, 15), "元宵节 上元节"); - L_FTV.put(new Pair<>(1, 18), "落灯日"); + L_FTV.put(MapUtil.entry(1, 1), "春节"); + L_FTV.put(MapUtil.entry(1, 2), "犬日"); + L_FTV.put(MapUtil.entry(1, 3), "猪日"); + L_FTV.put(MapUtil.entry(1, 4), "羊日"); + L_FTV.put(MapUtil.entry(1, 5), "牛日 破五日"); + L_FTV.put(MapUtil.entry(1, 6), "马日 送穷日"); + L_FTV.put(MapUtil.entry(1, 7), "人日 人胜节"); + L_FTV.put(MapUtil.entry(1, 8), "谷日 八仙日"); + L_FTV.put(MapUtil.entry(1, 9), "天日 九皇会"); + L_FTV.put(MapUtil.entry(1, 10), "地日 石头生日"); + L_FTV.put(MapUtil.entry(1, 12), "火日 老鼠娶媳妇日"); + L_FTV.put(MapUtil.entry(1, 13), "上(试)灯日 关公升天日"); + L_FTV.put(MapUtil.entry(1, 15), "元宵节 上元节"); + L_FTV.put(MapUtil.entry(1, 18), "落灯日"); // 二月 - L_FTV.put(new Pair<>(2, 1), "中和节 太阳生日"); - L_FTV.put(new Pair<>(2, 2), "龙抬头"); - L_FTV.put(new Pair<>(2, 12), "花朝节"); - L_FTV.put(new Pair<>(2, 19), "观世音圣诞"); + L_FTV.put(MapUtil.entry(2, 1), "中和节 太阳生日"); + L_FTV.put(MapUtil.entry(2, 2), "龙抬头"); + L_FTV.put(MapUtil.entry(2, 12), "花朝节"); + L_FTV.put(MapUtil.entry(2, 19), "观世音圣诞"); // 三月 - L_FTV.put(new Pair<>(3, 3), "上巳节"); + L_FTV.put(MapUtil.entry(3, 3), "上巳节"); // 四月 - L_FTV.put(new Pair<>(4, 1), "祭雹神"); - L_FTV.put(new Pair<>(4, 4), "文殊菩萨诞辰"); - L_FTV.put(new Pair<>(4, 8), "佛诞节"); + L_FTV.put(MapUtil.entry(4, 1), "祭雹神"); + L_FTV.put(MapUtil.entry(4, 4), "文殊菩萨诞辰"); + L_FTV.put(MapUtil.entry(4, 8), "佛诞节"); // 五月 - L_FTV.put(new Pair<>(5, 5), "端午节 端阳节"); + L_FTV.put(MapUtil.entry(5, 5), "端午节 端阳节"); // 六月 - L_FTV.put(new Pair<>(6, 6), "晒衣节 姑姑节"); - L_FTV.put(new Pair<>(6, 6), "天贶节"); - L_FTV.put(new Pair<>(6, 24), "彝族火把节"); + L_FTV.put(MapUtil.entry(6, 6), "晒衣节 姑姑节"); + L_FTV.put(MapUtil.entry(6, 6), "天贶节"); + L_FTV.put(MapUtil.entry(6, 24), "彝族火把节"); // 七月 - L_FTV.put(new Pair<>(7, 7), "七夕"); - L_FTV.put(new Pair<>(7, 14), "鬼节(南方)"); - L_FTV.put(new Pair<>(7, 15), "中元节"); - L_FTV.put(new Pair<>(7, 15), "盂兰盆节 中元节"); - L_FTV.put(new Pair<>(7, 30), "地藏节"); + L_FTV.put(MapUtil.entry(7, 7), "七夕"); + L_FTV.put(MapUtil.entry(7, 14), "鬼节(南方)"); + L_FTV.put(MapUtil.entry(7, 15), "中元节"); + L_FTV.put(MapUtil.entry(7, 15), "盂兰盆节 中元节"); + L_FTV.put(MapUtil.entry(7, 30), "地藏节"); // 八月 - L_FTV.put(new Pair<>(8, 15), "中秋节"); + L_FTV.put(MapUtil.entry(8, 15), "中秋节"); // 九月 - L_FTV.put(new Pair<>(9, 9), "重阳节"); + L_FTV.put(MapUtil.entry(9, 9), "重阳节"); // 十月 - L_FTV.put(new Pair<>(10, 1), "祭祖节"); - L_FTV.put(new Pair<>(10, 15), "下元节"); + L_FTV.put(MapUtil.entry(10, 1), "祭祖节"); + L_FTV.put(MapUtil.entry(10, 15), "下元节"); // 十一月 - L_FTV.put(new Pair<>(11, 17), "阿弥陀佛圣诞"); + L_FTV.put(MapUtil.entry(11, 17), "阿弥陀佛圣诞"); // 腊月 - L_FTV.put(new Pair<>(12, 8), "腊八节"); - L_FTV.put(new Pair<>(12, 16), "尾牙"); - L_FTV.put(new Pair<>(12, 23), "小年"); - L_FTV.put(new Pair<>(12, 30), "除夕"); + L_FTV.put(MapUtil.entry(12, 8), "腊八节"); + L_FTV.put(MapUtil.entry(12, 16), "尾牙"); + L_FTV.put(MapUtil.entry(12, 23), "小年"); + L_FTV.put(MapUtil.entry(12, 30), "除夕"); } /** @@ -110,6 +111,6 @@ public class LunarFestival { * @return 获得农历节日 */ public static List getFestivals(final int month, final int day) { - return L_FTV.getValues(new Pair<>(month, day)); + return L_FTV.getValues(MapUtil.entry(month, day)); } } diff --git a/hutool-core/src/main/java/cn/hutool/core/exceptions/InvocationTargetRuntimeException.java b/hutool-core/src/main/java/cn/hutool/core/exceptions/InvocationTargetRuntimeException.java new file mode 100644 index 000000000..0d2486471 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/exceptions/InvocationTargetRuntimeException.java @@ -0,0 +1,33 @@ +package cn.hutool.core.exceptions; + +/** + * InvocationTargetException的运行时异常 + * + * @author looly + */ +public class InvocationTargetRuntimeException extends UtilException { + + public InvocationTargetRuntimeException(final Throwable e) { + super(e); + } + + public InvocationTargetRuntimeException(final String message) { + super(message); + } + + public InvocationTargetRuntimeException(final String messageTemplate, final Object... params) { + super(messageTemplate, params); + } + + public InvocationTargetRuntimeException(final String message, final Throwable throwable) { + super(message, throwable); + } + + public InvocationTargetRuntimeException(final String message, final Throwable throwable, final boolean enableSuppression, final boolean writableStackTrace) { + super(message, throwable, enableSuppression, writableStackTrace); + } + + public InvocationTargetRuntimeException(final Throwable throwable, final String messageTemplate, final Object... params) { + super(throwable, messageTemplate, params); + } +} diff --git a/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java index 2354fd339..05f0eb1e2 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/FileTypeUtil.java @@ -190,6 +190,9 @@ public class FileTypeUtil { } else if ("docx".equalsIgnoreCase(extName)) { // issue#I47JGH typeName = "docx"; + } else if ("pptx".equalsIgnoreCase(extName)) { + // issue#I5A0GO + typeName = "pptx"; } } return typeName; diff --git a/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java index f7c5f1352..d91532038 100755 --- a/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java @@ -1097,7 +1097,7 @@ public class FileUtil extends PathUtil { * 情况如下: * *
-	 * 1、src和dest都为目录,则讲src下所有文件目录拷贝到dest下
+	 * 1、src和dest都为目录,则将src下所有文件目录拷贝到dest下
 	 * 2、src和dest都为文件,直接复制,名字为dest
 	 * 3、src为文件,dest为目录,将src拷贝到dest目录下
 	 * 
@@ -1117,7 +1117,7 @@ public class FileUtil extends PathUtil { * 情况如下: * *
-	 * 1、src和dest都为目录,则讲src下所有文件(包括子目录)拷贝到dest下
+	 * 1、src和dest都为目录,则将src下所有文件(包括子目录)拷贝到dest下
 	 * 2、src和dest都为文件,直接复制,名字为dest
 	 * 3、src为文件,dest为目录,将src拷贝到dest目录下
 	 * 
diff --git a/hutool-core/src/main/java/cn/hutool/core/io/resource/MultiResource.java b/hutool-core/src/main/java/cn/hutool/core/io/resource/MultiResource.java index 9a60ca009..90309d36e 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/resource/MultiResource.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/resource/MultiResource.java @@ -1,6 +1,6 @@ package cn.hutool.core.io.resource; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.io.IORuntimeException; import java.io.BufferedReader; @@ -32,7 +32,7 @@ public class MultiResource implements Resource, Iterable, Iterator, Iterator)resources; }else { - this.resources = CollUtil.newArrayList(resources); + this.resources = ListUtil.of(resources); } } diff --git a/hutool-core/src/main/java/cn/hutool/core/io/watch/watchers/WatcherChain.java b/hutool-core/src/main/java/cn/hutool/core/io/watch/watchers/WatcherChain.java index b955b1185..66e28f3a2 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/watch/watchers/WatcherChain.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/watch/watchers/WatcherChain.java @@ -1,6 +1,6 @@ package cn.hutool.core.io.watch.watchers; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.io.watch.Watcher; import cn.hutool.core.lang.Chain; @@ -35,7 +35,7 @@ public class WatcherChain implements Watcher, Chain{ * @param watchers 观察者列表 */ public WatcherChain(final Watcher... watchers) { - chain = CollUtil.newArrayList(watchers); + chain = ListUtil.of(watchers); } @Override diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Pair.java b/hutool-core/src/main/java/cn/hutool/core/lang/Pair.java deleted file mode 100644 index 3cf8d75d6..000000000 --- a/hutool-core/src/main/java/cn/hutool/core/lang/Pair.java +++ /dev/null @@ -1,87 +0,0 @@ -package cn.hutool.core.lang; - -import cn.hutool.core.clone.CloneSupport; - -import java.io.Serializable; -import java.util.Objects; - -/** - * 键值对对象,只能在构造时传入键值 - * - * @param 键类型 - * @param 值类型 - * @author looly - * @since 4.1.5 - */ -public class Pair extends CloneSupport> implements Serializable { - private static final long serialVersionUID = 1L; - - protected K key; - protected V value; - - /** - * 构建{@code Pair}对象 - * - * @param 键类型 - * @param 值类型 - * @param key 键 - * @param value 值 - * @return {@code Pair} - * @since 5.4.3 - */ - public static Pair of(final K key, final V value) { - return new Pair<>(key, value); - } - - /** - * 构造 - * - * @param key 键 - * @param value 值 - */ - public Pair(final K key, final V value) { - this.key = key; - this.value = value; - } - - /** - * 获取键 - * - * @return 键 - */ - public K getKey() { - return this.key; - } - - /** - * 获取值 - * - * @return 值 - */ - public V getValue() { - return this.value; - } - - @Override - public String toString() { - return "Pair [key=" + key + ", value=" + value + "]"; - } - - @Override - public boolean equals(final Object o) { - if (this == o) - return true; - if (o instanceof Pair) { - final Pair pair = (Pair) o; - return Objects.equals(getKey(), pair.getKey()) && - Objects.equals(getValue(), pair.getValue()); - } - return false; - } - - @Override - public int hashCode() { - //copy from 1.8 HashMap.Node - return Objects.hashCode(key) ^ Objects.hashCode(value); - } -} diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Singleton.java b/hutool-core/src/main/java/cn/hutool/core/lang/Singleton.java index 18e457896..7bb68d7ac 100755 --- a/hutool-core/src/main/java/cn/hutool/core/lang/Singleton.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/Singleton.java @@ -52,7 +52,16 @@ public final class Singleton { */ @SuppressWarnings("unchecked") public static T get(final String key, final Func0 supplier) { - return (T) POOL.computeIfAbsent(key, (k)-> supplier.callWithRuntimeException()); + //return (T) POOL.computeIfAbsent(key, (k)-> supplier.callWithRuntimeException()); + // issues#2349 + // ConcurrentHashMap.computeIfAbsent在某些情况下会导致死循环问题,此处采用Dubbo的解决方案 + + Object value = POOL.get(key); + if(null == value){ + POOL.putIfAbsent(key, supplier.callWithRuntimeException()); + value = POOL.get(key); + } + return (T) value; } /** diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Tuple.java b/hutool-core/src/main/java/cn/hutool/core/lang/Tuple.java index 076562520..354c93188 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/Tuple.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/Tuple.java @@ -64,7 +64,7 @@ public class Tuple extends CloneSupport implements Iterable, Seri * @since 5.6.6 */ public final List toList() { - return ListUtil.toList(this.members); + return ListUtil.of(this.members); } /** diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableEntry.java b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableEntry.java new file mode 100644 index 000000000..a8a9294d4 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutableEntry.java @@ -0,0 +1,87 @@ +package cn.hutool.core.lang.mutable; + +import cn.hutool.core.map.AbsEntry; + +import java.io.Serializable; +import java.util.Map; + +/** + * 可变键和值的{@link Map.Entry}实现,可以修改键和值 + * + * @param 键类型 + * @param 值类型 + * @author looly + */ +public class MutableEntry extends AbsEntry implements Mutable>, Serializable { + private static final long serialVersionUID = 1L; + + protected K key; + protected V value; + + /** + * 构造 + * + * @param key 键 + * @param value 值 + */ + public MutableEntry(final K key, final V value) { + this.key = key; + this.value = value; + } + + /** + * 获取键 + * + * @return 键 + */ + @Override + public K getKey() { + return this.key; + } + + /** + * 获取值 + * + * @return 值 + */ + @Override + public V getValue() { + return this.value; + } + + /** + * 设置键 + * + * @param key 新键 + * @return old key + */ + public K setKey(final K key) { + final K oldKey = this.key; + this.key = key; + return oldKey; + } + + /** + * 设置值 + * + * @param value 新值 + * @return old value + */ + @Override + public V setValue(final V value) { + final V oldValue = this.value; + this.value = value; + return oldValue; + } + + @Override + public Map.Entry get() { + return this; + } + + @Override + public void set(final Map.Entry pair) { + this.key = pair.getKey(); + this.value = pair.getValue(); + } +} diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutablePair.java b/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutablePair.java deleted file mode 100644 index dad8d93b2..000000000 --- a/hutool-core/src/main/java/cn/hutool/core/lang/mutable/MutablePair.java +++ /dev/null @@ -1,57 +0,0 @@ -package cn.hutool.core.lang.mutable; - -import cn.hutool.core.lang.Pair; - -/** - * 可变{@link Pair}实现,可以修改键和值 - * - * @param 键类型 - * @param 值类型 - * @since 5.7.16 - */ -public class MutablePair extends Pair implements Mutable>{ - private static final long serialVersionUID = 1L; - - /** - * 构造 - * - * @param key 键 - * @param value 值 - */ - public MutablePair(final K key, final V value) { - super(key, value); - } - - /** - * 设置键 - * - * @param key 新键 - * @return this - */ - public MutablePair setKey(final K key) { - this.key = key; - return this; - } - - /** - * 设置值 - * - * @param value 新值 - * @return this - */ - public MutablePair setValue(final V value) { - this.value = value; - return this; - } - - @Override - public Pair get() { - return this; - } - - @Override - public void set(final Pair pair) { - this.key = pair.getKey(); - this.value = pair.getValue(); - } -} diff --git a/hutool-core/src/main/java/cn/hutool/core/map/Dict.java b/hutool-core/src/main/java/cn/hutool/core/map/Dict.java index 77daf6244..89eb4f05e 100755 --- a/hutool-core/src/main/java/cn/hutool/core/map/Dict.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/Dict.java @@ -2,10 +2,10 @@ package cn.hutool.core.map; import cn.hutool.core.bean.BeanPath; import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.bean.copier.CopyOptions; +import cn.hutool.core.collection.SetUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.Assert; -import cn.hutool.core.lang.Pair; import cn.hutool.core.lang.func.Func0; import cn.hutool.core.lang.func.LambdaUtil; import cn.hutool.core.lang.getter.BasicTypeGetter; @@ -61,16 +61,15 @@ public class Dict extends LinkedHashMap implements BasicTypeGett } /** - * 根据给定的Pair数组创建Dict对象 + * 根据给定的Entry数组创建Dict对象 * * @param pairs 键值对 * @return Dict - * @since 5.4.1 */ @SafeVarargs - public static Dict of(final Pair... pairs) { + public static Dict ofEntries(final Map.Entry... pairs) { final Dict dict = create(); - for (final Pair pair : pairs) { + for (final Map.Entry pair : pairs) { dict.put(pair.getKey(), pair.getValue()); } return dict; @@ -94,7 +93,7 @@ public class Dict extends LinkedHashMap implements BasicTypeGett * @return Dict * @since 5.4.1 */ - public static Dict of(final Object... keysAndValues) { + public static Dict ofKvs(final Object... keysAndValues) { final Dict dict = create(); String key = null; @@ -248,7 +247,7 @@ public class Dict extends LinkedHashMap implements BasicTypeGett * @return vo */ public T toBeanIgnoreCase(final Class clazz) { - return BeanUtil.toBeanIgnoreCase(this, clazz, false); + return BeanUtil.toBean(this, clazz, CopyOptions.create().setIgnoreCase(true)); } /** @@ -290,7 +289,7 @@ public class Dict extends LinkedHashMap implements BasicTypeGett * @param withoutNames 不需要去除的字段名 */ public void removeEqual(final T dict, final String... withoutNames) { - final HashSet withoutSet = CollUtil.newHashSet(withoutNames); + final HashSet withoutSet = SetUtil.of(withoutNames); for (final Map.Entry entry : dict.entrySet()) { if (withoutSet.contains(entry.getKey())) { continue; @@ -536,7 +535,7 @@ public class Dict extends LinkedHashMap implements BasicTypeGett */ @SuppressWarnings("unchecked") public T getByPath(final String expression) { - return (T) BeanPath.create(expression).get(this); + return (T) BeanPath.of(expression).get(this); } /** diff --git a/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java b/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java index 115b7b45e..a555a9192 100755 --- a/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java @@ -1,6 +1,7 @@ package cn.hutool.core.map; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.func.Editor; import cn.hutool.core.lang.func.Filter; @@ -408,7 +409,7 @@ public class MapUtil { key = entry.getKey(); valueList = resultMap.get(key); if (null == valueList) { - valueList = CollUtil.newArrayList(entry.getValue()); + valueList = ListUtil.of(entry.getValue()); resultMap.put(key, valueList); } else { valueList.add(entry.getValue()); @@ -463,7 +464,7 @@ public class MapUtil { List vList; int vListSize; for (final Entry> entry : listMap.entrySet()) { - vList = CollUtil.newArrayList(entry.getValue()); + vList = ListUtil.of(entry.getValue()); vListSize = vList.size(); if (index < vListSize) { map.put(entry.getKey(), vList.get(index)); @@ -1411,7 +1412,7 @@ public class MapUtil { */ public static Map.Entry entry(final K key, final V value, final boolean isImmutable) { return isImmutable ? - new AbstractMap.SimpleEntry<>(key, value) : - new AbstractMap.SimpleImmutableEntry<>(key, value); + new AbstractMap.SimpleImmutableEntry<>(key, value) : + new AbstractMap.SimpleEntry<>(key, value); } } diff --git a/hutool-core/src/main/java/cn/hutool/core/map/ReferenceConcurrentMap.java b/hutool-core/src/main/java/cn/hutool/core/map/ReferenceConcurrentMap.java index 24aa640b5..6e7d43212 100755 --- a/hutool-core/src/main/java/cn/hutool/core/map/ReferenceConcurrentMap.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/ReferenceConcurrentMap.java @@ -1,7 +1,6 @@ package cn.hutool.core.map; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.func.Func0; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.ReferenceUtil; @@ -143,17 +142,6 @@ public class ReferenceConcurrentMap implements ConcurrentMap, Iterab return this.raw.computeIfPresent(ofKey(key, this.lastQueue), (kWeakKey, value) -> remappingFunction.apply(key, value)); } - /** - * 从缓存中获得对象,当对象不在缓存中或已经过期返回Func0回调产生的对象 - * - * @param key 键 - * @param supplier 如果不存在回调方法,用于生产值对象 - * @return 值对象 - */ - public V computeIfAbsent(final K key, final Func0 supplier) { - return computeIfAbsent(key, (keyParam) -> supplier.callWithRuntimeException()); - } - @SuppressWarnings("unchecked") @Override public V remove(final Object key) { diff --git a/hutool-core/src/main/java/cn/hutool/core/map/TableMap.java b/hutool-core/src/main/java/cn/hutool/core/map/TableMap.java index 2e53c835a..b6f10f31c 100755 --- a/hutool-core/src/main/java/cn/hutool/core/map/TableMap.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/TableMap.java @@ -56,8 +56,8 @@ public class TableMap implements Map, Iterable>, Ser * @param values 值列表 */ public TableMap(final K[] keys, final V[] values) { - this.keys = CollUtil.toList(keys); - this.values = CollUtil.toList(values); + this.keys = ListUtil.of(keys); + this.values = ListUtil.of(values); } @Override diff --git a/hutool-core/src/main/java/cn/hutool/core/math/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/math/NumberUtil.java index 5ff7b4b00..575f8a9e0 100644 --- a/hutool-core/src/main/java/cn/hutool/core/math/NumberUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/math/NumberUtil.java @@ -2,7 +2,6 @@ package cn.hutool.core.math; import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.lang.Assert; -import cn.hutool.core.math.Calculator; import cn.hutool.core.text.StrUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.CharUtil; @@ -34,9 +33,10 @@ import java.util.Set; *

* 相关介绍: *
    - *
  • http://www.oschina.net/code/snippet_563112_25237
  • - *
  • https://github.com/venusdrogon/feilong-core/wiki/one-jdk7-bug-thinking
  • + *
  • one-jdk7-bug-thinking
  • *
+ *

+ * TODO 需整理精简方法,去掉无用的重载方法。 * * @author Looly */ @@ -723,7 +723,7 @@ public class NumberUtil { if (v1 instanceof BigDecimal && v2 instanceof BigDecimal) { return div((BigDecimal) v1, (BigDecimal) v2, scale, roundingMode); } - return div(v1.toString(), v2.toString(), scale, roundingMode); + return div(StrUtil.toStringOrNull(v1), StrUtil.toStringOrNull(v2), scale, roundingMode); } /** @@ -1242,6 +1242,9 @@ public class NumberUtil { * @return 是否为整数 */ public static boolean isInteger(final String s) { + if(StrUtil.isBlank(s)) { + return false; + } try { Integer.parseInt(s); } catch (final NumberFormatException e) { @@ -1259,6 +1262,9 @@ public class NumberUtil { * @since 4.0.0 */ public static boolean isLong(final String s) { + if(StrUtil.isBlank(s)) { + return false; + } try { Long.parseLong(s); } catch (final NumberFormatException e) { @@ -1274,13 +1280,16 @@ public class NumberUtil { * @return 是否为{@link Double}类型 */ public static boolean isDouble(final String s) { + if(StrUtil.isBlank(s)) { + return false; + } try { Double.parseDouble(s); return s.contains("."); } catch (final NumberFormatException ignore) { // ignore } - return false; + return true; } /** @@ -2454,7 +2463,7 @@ public class NumberUtil { return 0L; } - if (number.startsWith("0x")) { + if (StrUtil.startWithIgnoreCase(number, "0x")) { // 0x04表示16进制数 return Long.parseLong(number.substring(2), 16); } @@ -2528,6 +2537,11 @@ public class NumberUtil { * @since 4.1.15 */ public static Number parseNumber(final String numberStr) throws NumberFormatException { + if (StrUtil.startWithIgnoreCase(numberStr, "0x")) { + // 0x04表示16进制数 + return Long.parseLong(numberStr.substring(2), 16); + } + try { final NumberFormat format = NumberFormat.getInstance(); if (format instanceof DecimalFormat) { diff --git a/hutool-core/src/main/java/cn/hutool/core/net/Ipv4Util.java b/hutool-core/src/main/java/cn/hutool/core/net/Ipv4Util.java index f9b5c19c9..1daf470f2 100755 --- a/hutool-core/src/main/java/cn/hutool/core/net/Ipv4Util.java +++ b/hutool-core/src/main/java/cn/hutool/core/net/Ipv4Util.java @@ -67,7 +67,7 @@ public class Ipv4Util { final String[] param = StrUtil.splitToArray(ipRange, IP_MASK_SPLIT_MARK); return list(param[0], Integer.parseInt(param[1]), isAll); } else { - return ListUtil.toList(ipRange); + return ListUtil.of(ipRange); } } diff --git a/hutool-core/src/main/java/cn/hutool/core/reflect/ClassUtil.java b/hutool-core/src/main/java/cn/hutool/core/reflect/ClassUtil.java index 1d040b686..6ee8b30bb 100644 --- a/hutool-core/src/main/java/cn/hutool/core/reflect/ClassUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/reflect/ClassUtil.java @@ -16,7 +16,6 @@ import cn.hutool.core.util.CharsetUtil; import java.io.IOException; import java.lang.annotation.Annotation; -import java.lang.reflect.Modifier; import java.lang.reflect.Type; import java.net.URI; import java.net.URL; @@ -461,16 +460,6 @@ public class ClassUtil { } } - /** - * 是否为抽象类 - * - * @param clazz 类 - * @return 是否为抽象类 - */ - public static boolean isAbstract(final Class clazz) { - return Modifier.isAbstract(clazz.getModifiers()); - } - /** * 是否为标准的类
* 这个类必须: @@ -490,7 +479,7 @@ public class ClassUtil { public static boolean isNormalClass(final Class clazz) { return null != clazz // && false == clazz.isInterface() // - && false == isAbstract(clazz) // + && false == ModifierUtil.isAbstract(clazz) // && false == clazz.isEnum() // && false == clazz.isArray() // && false == clazz.isAnnotation() // diff --git a/hutool-core/src/main/java/cn/hutool/core/reflect/ConstructorUtil.java b/hutool-core/src/main/java/cn/hutool/core/reflect/ConstructorUtil.java index f36b8bcf5..6c45826b1 100644 --- a/hutool-core/src/main/java/cn/hutool/core/reflect/ConstructorUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/reflect/ConstructorUtil.java @@ -64,7 +64,7 @@ public class ConstructorUtil { @SuppressWarnings("unchecked") public static Constructor[] getConstructors(final Class beanClass) throws SecurityException { Assert.notNull(beanClass); - return (Constructor[]) CONSTRUCTORS_CACHE.computeIfAbsent(beanClass, () -> getConstructorsDirectly(beanClass)); + return (Constructor[]) CONSTRUCTORS_CACHE.computeIfAbsent(beanClass, (key) -> getConstructorsDirectly(beanClass)); } /** diff --git a/hutool-core/src/main/java/cn/hutool/core/reflect/FieldUtil.java b/hutool-core/src/main/java/cn/hutool/core/reflect/FieldUtil.java index 3229d4e53..172cdcf0b 100644 --- a/hutool-core/src/main/java/cn/hutool/core/reflect/FieldUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/reflect/FieldUtil.java @@ -116,7 +116,7 @@ public class FieldUtil { */ public static Field[] getFields(final Class beanClass) throws SecurityException { Assert.notNull(beanClass); - return FIELDS_CACHE.computeIfAbsent(beanClass, () -> getFieldsDirectly(beanClass, true)); + return FIELDS_CACHE.computeIfAbsent(beanClass, (key) -> getFieldsDirectly(beanClass, true)); } diff --git a/hutool-core/src/main/java/cn/hutool/core/reflect/MethodUtil.java b/hutool-core/src/main/java/cn/hutool/core/reflect/MethodUtil.java index d5dffe169..0eaf74075 100644 --- a/hutool-core/src/main/java/cn/hutool/core/reflect/MethodUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/reflect/MethodUtil.java @@ -2,9 +2,10 @@ package cn.hutool.core.reflect; import cn.hutool.core.bean.NullWrapperBean; import cn.hutool.core.classloader.ClassLoaderUtil; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.SetUtil; import cn.hutool.core.collection.UniqueKeySet; import cn.hutool.core.convert.Convert; +import cn.hutool.core.exceptions.InvocationTargetRuntimeException; import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Singleton; @@ -13,6 +14,7 @@ import cn.hutool.core.map.WeakConcurrentMap; import cn.hutool.core.text.StrUtil; import cn.hutool.core.util.ArrayUtil; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; @@ -90,7 +92,7 @@ public class MethodUtil { * @return 过滤后的方法列表 */ public static Method[] getPublicMethods(final Class clazz, final Method... excludeMethods) { - final HashSet excludeMethodSet = CollUtil.newHashSet(excludeMethods); + final HashSet excludeMethodSet = SetUtil.of(excludeMethods); return getPublicMethods(clazz, method -> false == excludeMethodSet.contains(method)); } @@ -102,7 +104,7 @@ public class MethodUtil { * @return 过滤后的方法数组 */ public static Method[] getPublicMethods(final Class clazz, final String... excludeMethodNames) { - final HashSet excludeMethodNameSet = CollUtil.newHashSet(excludeMethodNames); + final HashSet excludeMethodNameSet = SetUtil.of(excludeMethodNames); return getPublicMethods(clazz, method -> false == excludeMethodNameSet.contains(method.getName())); } @@ -318,7 +320,7 @@ public class MethodUtil { public static Method[] getMethods(final Class beanClass) throws SecurityException { Assert.notNull(beanClass); return METHODS_CACHE.computeIfAbsent(beanClass, - () -> getMethodsDirectly(beanClass, true, true)); + (key) -> getMethodsDirectly(beanClass, true, true)); } /** @@ -536,37 +538,39 @@ public class MethodUtil { * @return 结果 * @throws UtilException 一些列异常的包装 */ - @SuppressWarnings("unchecked") public static T invoke(final Object obj, final Method method, final Object... args) throws UtilException { - ReflectUtil.setAccessible(method); - - // 检查用户传入参数: - // 1、忽略多余的参数 - // 2、参数不够补齐默认值 - // 3、通过NullWrapperBean传递的参数,会直接赋值null - // 4、传入参数为null,但是目标参数类型为原始类型,做转换 - // 5、传入参数类型不对应,尝试转换类型 - final Class[] parameterTypes = method.getParameterTypes(); - final Object[] actualArgs = new Object[parameterTypes.length]; - if (null != args) { - for (int i = 0; i < actualArgs.length; i++) { - if (i >= args.length || null == args[i]) { - // 越界或者空值 - actualArgs[i] = ClassUtil.getDefaultValue(parameterTypes[i]); - } else if (args[i] instanceof NullWrapperBean) { - //如果是通过NullWrapperBean传递的null参数,直接赋值null - actualArgs[i] = null; - } else if (false == parameterTypes[i].isAssignableFrom(args[i].getClass())) { - //对于类型不同的字段,尝试转换,转换失败则使用原对象类型 - final Object targetValue = Convert.convert(parameterTypes[i], args[i]); - if (null != targetValue) { - actualArgs[i] = targetValue; - } - } else { - actualArgs[i] = args[i]; - } - } + try { + return invokeRaw(obj, method, args); + } catch (final InvocationTargetException e) { + throw new InvocationTargetRuntimeException(e); + } catch (final IllegalAccessException e) { + throw new UtilException(e); } + } + + /** + * 执行方法 + * + *

+ * 对于用户传入参数会做必要检查,包括: + * + *

+	 *     1、忽略多余的参数
+	 *     2、参数不够补齐默认值
+	 *     3、传入参数为null,但是目标参数类型为原始类型,做转换
+	 * 
+ * + * @param 返回对象类型 + * @param obj 对象,如果执行静态方法,此值为{@code null} + * @param method 方法(对象方法或static方法都可) + * @param args 参数对象 + * @return 结果 + * @throws InvocationTargetRuntimeException 目标方法执行异常 + * @throws IllegalAccessException 访问权限异常 + */ + @SuppressWarnings("unchecked") + public static T invokeRaw(final Object obj, final Method method, final Object... args) throws InvocationTargetException, IllegalAccessException { + ReflectUtil.setAccessible(method); if (method.isDefault()) { // 当方法是default方法时,尤其对象是代理对象,需使用句柄方式执行 @@ -574,11 +578,7 @@ public class MethodUtil { return MethodHandleUtil.invokeSpecial(obj, method, args); } - try { - return (T) method.invoke(ModifierUtil.isStatic(method) ? null : obj, actualArgs); - } catch (final Exception e) { - throw new UtilException(e); - } + return (T) method.invoke(ModifierUtil.isStatic(method) ? null : obj, actualArgs(method, args)); } /** @@ -737,4 +737,44 @@ public class MethodUtil { } return result; } + + /** + * 检查用户传入参数: + *
    + *
  • 1、忽略多余的参数
  • + *
  • 2、参数不够补齐默认值
  • + *
  • 3、通过NullWrapperBean传递的参数,会直接赋值null
  • + *
  • 4、传入参数为null,但是目标参数类型为原始类型,做转换
  • + *
  • 5、传入参数类型不对应,尝试转换类型
  • + *
+ * + * @param method 方法 + * @param args 参数 + * @return 实际的参数数组 + */ + private static Object[] actualArgs(final Method method, final Object[] args) { + final Class[] parameterTypes = method.getParameterTypes(); + final Object[] actualArgs = new Object[parameterTypes.length]; + if (null != args) { + for (int i = 0; i < actualArgs.length; i++) { + if (i >= args.length || null == args[i]) { + // 越界或者空值 + actualArgs[i] = ClassUtil.getDefaultValue(parameterTypes[i]); + } else if (args[i] instanceof NullWrapperBean) { + //如果是通过NullWrapperBean传递的null参数,直接赋值null + actualArgs[i] = null; + } else if (false == parameterTypes[i].isAssignableFrom(args[i].getClass())) { + //对于类型不同的字段,尝试转换,转换失败则使用原对象类型 + final Object targetValue = Convert.convert(parameterTypes[i], args[i]); + if (null != targetValue) { + actualArgs[i] = targetValue; + } + } else { + actualArgs[i] = args[i]; + } + } + } + + return actualArgs; + } } diff --git a/hutool-core/src/main/java/cn/hutool/core/reflect/ModifierUtil.java b/hutool-core/src/main/java/cn/hutool/core/reflect/ModifierUtil.java index ad791920f..9560e564e 100644 --- a/hutool-core/src/main/java/cn/hutool/core/reflect/ModifierUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/reflect/ModifierUtil.java @@ -192,6 +192,27 @@ public class ModifierUtil { public static boolean isAbstract(final Member member) { return hasModifier(member, ModifierType.ABSTRACT); } + + /** + * 是否抽象类 + * + * @param clazz 构造、字段或方法 + * @return 是否抽象类 + * @since 5.7.23 + */ + public static boolean isAbstract(final Class clazz) { + return hasModifier(clazz, ModifierType.ABSTRACT); + } + + /** + * 是否抽象类 + * + * @param clazz 构造、字段或方法 + * @return 是否抽象类 + */ + public static boolean isInterface(final Class clazz) { + return null != clazz && clazz.isInterface(); + } //-------------------------------------------------------------------------------------------------------- Private method start /** diff --git a/hutool-core/src/main/java/cn/hutool/core/regex/ReUtil.java b/hutool-core/src/main/java/cn/hutool/core/regex/ReUtil.java index 34827b9e3..1012f0309 100755 --- a/hutool-core/src/main/java/cn/hutool/core/regex/ReUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/regex/ReUtil.java @@ -1,6 +1,6 @@ package cn.hutool.core.regex; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.SetUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.lang.Assert; @@ -45,7 +45,7 @@ public class ReUtil { /** * 正则中需要被转义的关键字 */ - public final static Set RE_KEYS = CollUtil.newHashSet('$', '(', ')', '*', '+', '.', '[', ']', '?', '\\', '^', '{', '}', '|'); + public final static Set RE_KEYS = SetUtil.of('$', '(', ')', '*', '+', '.', '[', ']', '?', '\\', '^', '{', '}', '|'); /** * 获得匹配的字符串,获得正则中分组0的内容 diff --git a/hutool-core/src/main/java/cn/hutool/core/regex/RegexPool.java b/hutool-core/src/main/java/cn/hutool/core/regex/RegexPool.java index 50f8edc5d..6d8cfa9be 100755 --- a/hutool-core/src/main/java/cn/hutool/core/regex/RegexPool.java +++ b/hutool-core/src/main/java/cn/hutool/core/regex/RegexPool.java @@ -168,7 +168,7 @@ public interface RegexPool { * 十七位码、车架号 * 车辆的唯一标示 */ - String CAR_VIN = "^[A-Za-z0-9]{17}$"; + String CAR_VIN = "^[A-HJ-NPR-Z0-9]{8}[0-9X][A-HJ-NPR-Z0-9]{2}\\d{6}$"; /** * 驾驶证 别名:驾驶证档案编号、行驶证编号 * eg:430101758218 diff --git a/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java b/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java index 0e85ff9cd..e3fb13a37 100755 --- a/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java @@ -779,6 +779,28 @@ public class CharSequenceUtil { return false; } + /** + * 给定字符串是否以任何一个字符串结尾(忽略大小写)
+ * 给定字符串和数组为空都返回false + * + * @param str 给定字符串 + * @param suffixes 需要检测的结尾字符串 + * @return 给定字符串是否以任何一个字符串结尾 + * @since 6.0.0 + */ + public static boolean startWithAnyIgnoreCase(final CharSequence str, final CharSequence... suffixes) { + if (isEmpty(str) || ArrayUtil.isEmpty(suffixes)) { + return false; + } + + for (final CharSequence suffix : suffixes) { + if (startWith(str, suffix, true)) { + return true; + } + } + return false; + } + // ------------------------------------------------------------------------ endWith /** @@ -2706,7 +2728,7 @@ public class CharSequenceUtil { * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
* 例:
* 通常使用:format("this is {} for {}", "a", "b") =》 this is a for b
- * 转义{}: format("this is \\{} for {}", "a", "b") =》 this is \{} for a
+ * 转义{}: format("this is \\{} for {}", "a", "b") =》 this is {} for a
* 转义\: format("this is \\\\{} for {}", "a", "b") =》 this is \a for b
* * @param template 文本模板,被替换的部分用 {} 表示,如果模板为null,返回"null" diff --git a/hutool-core/src/main/java/cn/hutool/core/text/dfa/StopChar.java b/hutool-core/src/main/java/cn/hutool/core/text/dfa/StopChar.java index dfe55e857..c924b7741 100755 --- a/hutool-core/src/main/java/cn/hutool/core/text/dfa/StopChar.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/dfa/StopChar.java @@ -1,8 +1,8 @@ package cn.hutool.core.text.dfa; -import java.util.Set; +import cn.hutool.core.collection.SetUtil; -import cn.hutool.core.collection.CollUtil; +import java.util.Set; /** * 过滤词及一些简单处理 @@ -11,7 +11,7 @@ import cn.hutool.core.collection.CollUtil; */ public class StopChar { /** 不需要处理的词,如标点符号、空格等 */ - public static final Set STOP_WORD = CollUtil.newHashSet(' ', '\'', '、', '。', // + public static final Set STOP_WORD = SetUtil.of(' ', '\'', '、', '。', // '·', 'ˉ', 'ˇ', '々', '—', '~', '‖', '…', '‘', '’', '“', '”', '〔', '〕', '〈', '〉', '《', '》', '「', '」', '『', // '』', '〖', '〗', '【', '】', '±', '+', '-', '×', '÷', '∧', '∨', '∑', '∏', '∪', '∩', '∈', '√', '⊥', '⊙', '∫', // '∮', '≡', '≌', '≈', '∽', '∝', '≠', '≮', '≯', '≤', '≥', '∞', '∶', '∵', '∴', '∷', '♂', '♀', '°', '′', '〃', // diff --git a/hutool-core/src/main/java/cn/hutool/core/text/dfa/WordTree.java b/hutool-core/src/main/java/cn/hutool/core/text/dfa/WordTree.java index 38ade3859..157c26e44 100755 --- a/hutool-core/src/main/java/cn/hutool/core/text/dfa/WordTree.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/dfa/WordTree.java @@ -1,6 +1,7 @@ package cn.hutool.core.text.dfa; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.SetUtil; import cn.hutool.core.text.StrUtil; import java.util.ArrayList; @@ -85,7 +86,7 @@ public class WordTree extends HashMap { * @return this */ public WordTree addWords(final String... words) { - for (final String word : CollUtil.newHashSet(words)) { + for (final String word : SetUtil.of(words)) { addWord(word); } return this; diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java index 6d46e5c7a..5ebc60786 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java @@ -1,6 +1,7 @@ package cn.hutool.core.util; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.collection.UniqueKeySet; import cn.hutool.core.comparator.CompareUtil; import cn.hutool.core.exceptions.UtilException; @@ -1287,7 +1288,7 @@ public class ArrayUtil extends PrimitiveArrayUtil { * @since 3.0.9 */ public static T[] toArray(final Iterator iterator, final Class componentType) { - return toArray(CollUtil.newArrayList(iterator), componentType); + return toArray(ListUtil.of(iterator), componentType); } /** diff --git a/hutool-core/src/main/java/cn/hutool/core/util/BooleanUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/BooleanUtil.java index 2897ed1c2..cf5e974b1 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/BooleanUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/BooleanUtil.java @@ -1,6 +1,6 @@ package cn.hutool.core.util; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.SetUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.text.StrUtil; @@ -15,7 +15,9 @@ import java.util.Set; public class BooleanUtil { /** 表示为真的字符串 */ - private static final Set TRUE_SET = CollUtil.newHashSet("true", "yes", "y", "t", "ok", "1", "on", "是", "对", "真", "對", "√"); + private static final Set TRUE_SET = SetUtil.of("true", "yes", "y", "t", "ok", "1", "on", "是", "对", "真", "對", "√"); + /** 表示为假的字符串 */ + private static final Set FALSE_SET = SetUtil.of("false", "no", "n", "f", "0", "off", "否", "错", "假", "錯", "×"); /** * 取相反值 @@ -86,6 +88,28 @@ public class BooleanUtil { return false; } + /** + * 转换字符串为boolean值
+ * 如果为["true", "yes", "y", "t", "ok", "1", "on", "是", "对", "真", "對", "√"],返回{@code true}
+ * 如果为["false", "no", "n", "f", "0", "off", "否", "错", "假", "錯", "×"],返回{@code false}
+ * 其他情况返回{@code null} + * + * @param valueStr 字符串 + * @return boolean值 + * @since 5.8.1 + */ + public static Boolean toBooleanObject(String valueStr) { + if (StrUtil.isNotBlank(valueStr)) { + valueStr = valueStr.trim().toLowerCase(); + if(TRUE_SET.contains(valueStr)){ + return true; + } else if(FALSE_SET.contains(valueStr)){ + return false; + } + } + return null; + } + /** * boolean值转为int * diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ByteUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ByteUtil.java index 6d30f7272..d5d0ff30d 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ByteUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ByteUtil.java @@ -77,11 +77,24 @@ public class ByteUtil { * @return short值 */ public static short bytesToShort(final byte[] bytes, final ByteOrder byteOrder) { + return bytesToShort(bytes, 0, byteOrder); + } + + /** + * byte数组转short
+ * 自定义端序 + * + * @param bytes byte数组,长度必须大于2 + * @param start 开始位置 + * @param byteOrder 端序 + * @return short值 + */ + public static short bytesToShort(final byte[] bytes, final int start, final ByteOrder byteOrder) { if (ByteOrder.LITTLE_ENDIAN == byteOrder) { //小端模式,数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中 - return (short) (bytes[0] & 0xff | (bytes[1] & 0xff) << Byte.SIZE); + return (short) (bytes[start] & 0xff | (bytes[start + 1] & 0xff) << Byte.SIZE); } else { - return (short) (bytes[1] & 0xff | (bytes[0] & 0xff) << Byte.SIZE); + return (short) (bytes[start + 1] & 0xff | (bytes[start] & 0xff) << Byte.SIZE); } } @@ -144,7 +157,7 @@ public class ByteUtil { * 自定义端序 * * @param bytes byte数组 - * @param start 开始位置(包含) + * @param start 开始位置(包含) * @param byteOrder 端序 * @return int值 * @since 5.7.21 @@ -407,9 +420,9 @@ public class ByteUtil { * @return bytes */ public static byte[] numberToBytes(final Number number, final ByteOrder byteOrder) { - if(number instanceof Byte){ + if (number instanceof Byte) { return new byte[]{number.byteValue()}; - }else if (number instanceof Double) { + } else if (number instanceof Double) { return doubleToBytes((Double) number, byteOrder); } else if (number instanceof Long) { return longToBytes((Long) number, byteOrder); diff --git a/hutool-core/src/main/java/cn/hutool/core/util/IdcardUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/IdcardUtil.java index 14ff3d34e..3bf357b46 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/IdcardUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/IdcardUtil.java @@ -16,12 +16,12 @@ import java.util.Map; import java.util.Objects; /** - * 身份证相关工具类
- * see https://www.oschina.net/code/snippet_1611_2881 + * 身份证相关工具类,参考标准:GB 11643-1999
+ * 标准描述见:http://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=080D6FBF2BB468F9007657F26D60013E * *

- * 本工具并没有对行政区划代码做校验,如有需求,请参阅(2018年10月): - * http://www.mca.gov.cn/article/sj/xzqh/2018/201804-12/20181011221630.html + * 本工具并没有对行政区划代码做校验,如有需求,请参阅(2020年12月): + * http://www.mca.gov.cn/article/sj/xzqh/2020/20201201.html *

* * @author Looly @@ -118,7 +118,8 @@ public class IdcardUtil { } /** - * 将15位身份证号码转换为18位 + * 将15位身份证号码转换为18位
+ * 15位身份证号码遵循GB 11643-1989标准。 * * @param idCard 15位身份编码 * @return 18位身份编码 @@ -422,17 +423,6 @@ public class IdcardUtil { return sum % 11 == 0; } - /** - * 根据身份编号获取生日,只支持15或18位身份证号码 - * - * @param idcard 身份编号 - * @return 生日(yyyyMMdd) - * @see #getBirth(String) - */ - public static String getBirthByIdCard(final String idcard) { - return getBirth(idcard); - } - /** * 根据身份编号获取生日,只支持15或18位身份证号码 * @@ -458,8 +448,8 @@ public class IdcardUtil { * @return 日期 */ public static DateTime getBirthDate(final String idCard) { - final String birthByIdCard = getBirthByIdCard(idCard); - return null == birthByIdCard ? null : DateUtil.parse(birthByIdCard, DatePattern.PURE_DATE_FORMAT); + final String birth = getBirth(idCard); + return null == birth ? null : DateUtil.parse(birth, DatePattern.PURE_DATE_FORMAT); } /** @@ -468,8 +458,8 @@ public class IdcardUtil { * @param idcard 身份编号 * @return 年龄 */ - public static int getAgeByIdCard(final String idcard) { - return getAgeByIdCard(idcard, DateUtil.date()); + public static int getAge(final String idcard) { + return getAge(idcard, DateUtil.date()); } /** @@ -479,9 +469,8 @@ public class IdcardUtil { * @param dateToCompare 以此日期为界,计算年龄。 * @return 年龄 */ - public static int getAgeByIdCard(final String idcard, final Date dateToCompare) { - final String birth = getBirthByIdCard(idcard); - return DateUtil.age(DateUtil.parse(birth, "yyyyMMdd"), dateToCompare); + public static int getAge(final String idcard, final Date dateToCompare) { + return DateUtil.age(getBirthDate(idcard), dateToCompare); } /** @@ -490,7 +479,7 @@ public class IdcardUtil { * @param idcard 身份编号 * @return 生日(yyyy) */ - public static Short getYearByIdCard(String idcard) { + public static Short getBirthYear(String idcard) { final int len = idcard.length(); if (len < CHINA_ID_MIN_LENGTH) { return null; @@ -506,7 +495,7 @@ public class IdcardUtil { * @param idcard 身份编号 * @return 生日(MM) */ - public static Short getMonthByIdCard(String idcard) { + public static Short getBirthMonth(String idcard) { final int len = idcard.length(); if (len < CHINA_ID_MIN_LENGTH) { return null; @@ -522,7 +511,7 @@ public class IdcardUtil { * @param idcard 身份编号 * @return 生日(dd) */ - public static Short getDayByIdCard(String idcard) { + public static Short getBirthDay(String idcard) { final int len = idcard.length(); if (len < CHINA_ID_MIN_LENGTH) { return null; @@ -538,7 +527,7 @@ public class IdcardUtil { * @param idcard 身份编号 * @return 性别(1 : 男 , 0 : 女) */ - public static int getGenderByIdCard(String idcard) { + public static int getGender(String idcard) { Assert.notBlank(idcard); final int len = idcard.length(); if (len < CHINA_ID_MIN_LENGTH) { @@ -559,7 +548,7 @@ public class IdcardUtil { * @return 省份编码 * @since 5.7.2 */ - public static String getProvinceCodeByIdCard(final String idcard) { + public static String getProvinceCode(final String idcard) { final int len = idcard.length(); if (len == CHINA_ID_MIN_LENGTH || len == CHINA_ID_MAX_LENGTH) { return idcard.substring(0, 2); @@ -573,8 +562,8 @@ public class IdcardUtil { * @param idcard 身份编码 * @return 省份名称。 */ - public static String getProvinceByIdCard(final String idcard) { - final String code = getProvinceCodeByIdCard(idcard); + public static String getProvince(final String idcard) { + final String code = getProvinceCode(idcard); if (StrUtil.isNotBlank(code)) { return CITY_CODES.get(code); } @@ -588,7 +577,7 @@ public class IdcardUtil { * @param idcard 身份编码 * @return 地市级编码 */ - public static String getCityCodeByIdCard(final String idcard) { + public static String getCityCode(final String idcard) { final int len = idcard.length(); if (len == CHINA_ID_MIN_LENGTH || len == CHINA_ID_MAX_LENGTH) { return idcard.substring(0, 4); @@ -604,7 +593,7 @@ public class IdcardUtil { * @return 地市级编码 * @since 5.8.0 */ - public static String getDistrictCodeByIdCard(final String idcard) { + public static String getDistrictCode(final String idcard) { final int len = idcard.length(); if (len == CHINA_ID_MIN_LENGTH || len == CHINA_ID_MAX_LENGTH) { return idcard.substring(0, 6); @@ -637,6 +626,28 @@ public class IdcardUtil { return new Idcard(idcard); } + /** + * 港澳居民来往内地通行证,俗称:回乡证,通行证号码组成规则:
+ *
    + *
  • 通行证证件号码共11位。第1位为字母,“H”字头签发给香港居民,“M”字头签发给澳门居民。
  • + *
  • 第2位至第11位为数字,前8位数字为通行证持有人的终身号,后2位数字表示换证次数,首次发证为00,此后依次递增。
  • + *
+ * 示例:H12345678、M1234567801 + * + *

+ * 参考文档《港澳居民来往内地通行证号码规则》: + * https://www.hmo.gov.cn/fwga_new/wldjnd/201711/t20171120_1333.html + *

+ */ + public static boolean isValidHkMoHomeReturn(final String idCard) { + if (StrUtil.isEmpty(idCard)) { + return false; + } + // 规则: H/M + 8位或10位数字 + // 样本: H1234567890 + final String reg = "^[HhMm](\\d{8}|\\d{10})$"; + return idCard.matches(reg); + } // ----------------------------------------------------------------------------------- Private method start /** @@ -723,11 +734,11 @@ public class IdcardUtil { * @param idcard 身份证号码 */ public Idcard(final String idcard) { - this.provinceCode = IdcardUtil.getProvinceCodeByIdCard(idcard); - this.cityCode = IdcardUtil.getCityCodeByIdCard(idcard); + this.provinceCode = IdcardUtil.getProvinceCode(idcard); + this.cityCode = IdcardUtil.getCityCode(idcard); this.birthDate = IdcardUtil.getBirthDate(idcard); - this.gender = IdcardUtil.getGenderByIdCard(idcard); - this.age = IdcardUtil.getAgeByIdCard(idcard); + this.gender = IdcardUtil.getGender(idcard); + this.age = IdcardUtil.getAge(idcard); } /** diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ObjUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ObjUtil.java index a14147299..10eee71d1 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ObjUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ObjUtil.java @@ -67,6 +67,7 @@ public class ObjUtil { *
  • CharSequence
  • *
  • Map
  • *
  • Iterator
  • + *
  • Iterable
  • *
  • Enumeration
  • *
  • Array
  • * @@ -89,8 +90,8 @@ public class ObjUtil { } int count; - if (obj instanceof Iterator) { - final Iterator iter = (Iterator) obj; + if (obj instanceof Iterator || obj instanceof Iterable) { + final Iterator iter = (obj instanceof Iterator) ? (Iterator) obj : ((Iterable) obj).iterator(); count = 0; while (iter.hasNext()) { count++; @@ -107,7 +108,7 @@ public class ObjUtil { } return count; } - if (obj.getClass().isArray() == true) { + if (obj.getClass().isArray()) { return Array.getLength(obj); } return -1; @@ -121,6 +122,7 @@ public class ObjUtil { *
  • Collection
  • *
  • Map
  • *
  • Iterator
  • + *
  • Iterable
  • *
  • Enumeration
  • *
  • Array
  • * @@ -146,8 +148,8 @@ public class ObjUtil { return ((Map) obj).containsValue(element); } - if (obj instanceof Iterator) { - final Iterator iter = (Iterator) obj; + if (obj instanceof Iterator || obj instanceof Iterable) { + final Iterator iter = obj instanceof Iterator ? (Iterator) obj : ((Iterable) obj).iterator(); while (iter.hasNext()) { final Object o = iter.next(); if (equals(o, element)) { diff --git a/hutool-core/src/main/java/cn/hutool/core/util/RandomUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/RandomUtil.java index 7cc6efb88..77453b431 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/RandomUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/RandomUtil.java @@ -445,7 +445,7 @@ public class RandomUtil { */ public static List randomEleList(final List source, final int count) { if (count >= source.size()) { - return ListUtil.toList(source); + return ListUtil.of(source); } final int[] randomList = ArrayUtil.sub(randomInts(source.size()), 0, count); final List result = new ArrayList<>(); diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ScriptUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ScriptUtil.java index c68f6f02c..3b567aa65 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/ScriptUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ScriptUtil.java @@ -30,7 +30,7 @@ public class ScriptUtil { * @return {@link ScriptEngine} 实例 */ public static ScriptEngine getScript(final String nameOrExtOrMime) { - return CACHE.computeIfAbsent(nameOrExtOrMime, () -> createScript(nameOrExtOrMime)); + return CACHE.computeIfAbsent(nameOrExtOrMime, (key) -> createScript(nameOrExtOrMime)); } /** diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ServiceLoaderUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ServiceLoaderUtil.java index f45959ffb..953b3aa51 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ServiceLoaderUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ServiceLoaderUtil.java @@ -102,6 +102,6 @@ public class ServiceLoaderUtil { * @since 5.4.2 */ public static List loadList(final Class clazz, final ClassLoader loader) { - return ListUtil.list(false, load(clazz, loader)); + return ListUtil.of(false, load(clazz, loader)); } } diff --git a/hutool-core/src/main/java/cn/hutool/core/util/XmlUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/XmlUtil.java index e703451be..a2c97dc37 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/XmlUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/XmlUtil.java @@ -1,7 +1,7 @@ package cn.hutool.core.util; import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IORuntimeException; @@ -1109,7 +1109,7 @@ public class XmlUtil { if (value instanceof List) { ((List) value).add(newValue); } else { - result.put(childEle.getNodeName(), CollUtil.newArrayList(value, newValue)); + result.put(childEle.getNodeName(), ListUtil.of(value, newValue)); } } else { result.put(childEle.getNodeName(), newValue); diff --git a/hutool-core/src/test/java/cn/hutool/core/bean/BeanPathTest.java b/hutool-core/src/test/java/cn/hutool/core/bean/BeanPathTest.java index 76b1af97f..25c1a89f6 100644 --- a/hutool-core/src/test/java/cn/hutool/core/bean/BeanPathTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/bean/BeanPathTest.java @@ -1,17 +1,16 @@ package cn.hutool.core.bean; +import cn.hutool.core.lang.test.bean.ExamInfoDict; +import cn.hutool.core.lang.test.bean.UserInfoDict; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import cn.hutool.core.lang.test.bean.ExamInfoDict; -import cn.hutool.core.lang.test.bean.UserInfoDict; - /** * {@link BeanPath} 单元测试 * @@ -87,14 +86,14 @@ public class BeanPathTest { @Test public void getTest() { - final BeanPath pattern = BeanPath.create("userInfo.examInfoDict[0].id"); + final BeanPath pattern = BeanPath.of("userInfo.examInfoDict[0].id"); final Object result = pattern.get(tempMap); Assert.assertEquals(1, result); } @Test public void setTest() { - final BeanPath pattern = BeanPath.create("userInfo.examInfoDict[0].id"); + final BeanPath pattern = BeanPath.of("userInfo.examInfoDict[0].id"); pattern.set(tempMap, 2); final Object result = pattern.get(tempMap); Assert.assertEquals(2, result); @@ -102,9 +101,28 @@ public class BeanPathTest { @Test public void getMapTest () { - final BeanPath pattern = BeanPath.create("userInfo[id, photoPath]"); - @SuppressWarnings("unchecked") final Map result = (Map)pattern.get(tempMap); + final BeanPath pattern = BeanPath.of("userInfo[id, photoPath]"); + @SuppressWarnings("unchecked") + final Map result = (Map)pattern.get(tempMap); Assert.assertEquals(1, result.get("id")); Assert.assertEquals("yx.mm.com", result.get("photoPath")); } + + @Test + public void getKeyWithDotTest () { + Map dataMap = new HashMap<>(16); + dataMap.put("aa", "value0"); + dataMap.put("aa.bb.cc", "value111111");// key 是类名 格式 带 ' . ' + + final BeanPath pattern = BeanPath.of("'aa.bb.cc'"); + Assert.assertEquals("value111111", pattern.get(dataMap)); + } + + @Test + public void compileTest(){ + final BeanPath of = BeanPath.of("'abc.dd'.ee.ff'.'"); + Assert.assertEquals("abc.dd", of.getPatternParts().get(0)); + Assert.assertEquals("ee", of.getPatternParts().get(1)); + Assert.assertEquals("ff.", of.getPatternParts().get(2)); + } } diff --git a/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java index 1757b179c..77bfcc86d 100755 --- a/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java @@ -3,14 +3,14 @@ package cn.hutool.core.bean; import cn.hutool.core.annotation.Alias; import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.bean.copier.ValueProvider; -import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.collection.SetUtil; import cn.hutool.core.map.MapBuilder; import cn.hutool.core.map.MapUtil; +import cn.hutool.core.text.StrUtil; import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjUtil; -import cn.hutool.core.text.StrUtil; import lombok.Data; import lombok.Getter; import lombok.Setter; @@ -116,7 +116,7 @@ public class BeanUtilTest { // 错误的类型,此处忽略 map.put("age", "aaaaaa"); - final Person person = BeanUtil.toBeanIgnoreError(map, Person.class); + final Person person = BeanUtil.toBean(map, Person.class, CopyOptions.create().setIgnoreError(true)); Assert.assertEquals("Joe", person.getName()); // 错误的类型,不copy这个字段,使用对象创建的默认值 Assert.assertEquals(0, person.getAge()); @@ -128,7 +128,7 @@ public class BeanUtilTest { map.put("Name", "Joe"); map.put("aGe", 12); - final Person person = BeanUtil.toBeanIgnoreCase(map, Person.class, false); + final Person person = BeanUtil.toBean(map, Person.class, CopyOptions.create().setIgnoreCase(true)); Assert.assertEquals("Joe", person.getName()); Assert.assertEquals(12, person.getAge()); } @@ -191,6 +191,23 @@ public class BeanUtilTest { Assert.assertFalse(map.containsKey("SUBNAME")); } + @Test + public void beanToMapNullPropertiesTest() { + final SubPerson person = new SubPerson(); + person.setAge(14); + person.setOpenid("11213232"); + person.setName("测试A11"); + person.setSubName("sub名字"); + + final Map map = BeanUtil.beanToMap(person, (String[])null); + + Assert.assertEquals("测试A11", map.get("name")); + Assert.assertEquals(14, map.get("age")); + Assert.assertEquals("11213232", map.get("openid")); + // static属性应被忽略 + Assert.assertFalse(map.containsKey("SUBNAME")); + } + @Test public void beanToMapTest2() { final SubPerson person = new SubPerson(); @@ -285,7 +302,7 @@ public class BeanUtilTest { @Test public void getPropertyDescriptorsTest() { - final HashSet set = CollUtil.newHashSet(); + final HashSet set = SetUtil.of(); final PropertyDescriptor[] propertyDescriptors = BeanUtil.getPropertyDescriptors(SubPerson.class); for (final PropertyDescriptor propertyDescriptor : propertyDescriptors) { set.add(propertyDescriptor.getName()); @@ -326,7 +343,7 @@ public class BeanUtilTest { student.setAge(125); student.setNo(8848L); - final List studentList = ListUtil.of(student, student2); + final List studentList = ListUtil.view(student, student2); for (int i=0;i<5000;i++){ new Thread(()->{ @@ -550,6 +567,11 @@ public class BeanUtilTest { Assert.assertNull(newFood.getCode()); } + @Test + public void copyNullTest() { + Assert.assertNull(BeanUtil.copyProperties(null, Food.class)); + } + @Test public void copyBeanPropertiesFilterTest() { final Food info = new Food(); @@ -633,7 +655,7 @@ public class BeanUtilTest { student.setAge(125); student.setNo(8848L); - final List studentList = ListUtil.of(student, student2); + final List studentList = ListUtil.view(student, student2); final List people = BeanUtil.copyToList(studentList, Person.class); Assert.assertEquals(studentList.size(), people.size()); @@ -687,7 +709,7 @@ public class BeanUtilTest { testPojo.setTestPojo2List(new TestPojo2[]{testPojo2, testPojo3}); - final BeanPath beanPath = BeanPath.create("testPojo2List.age"); + final BeanPath beanPath = BeanPath.of("testPojo2List.age"); final Object o = beanPath.get(testPojo); Assert.assertEquals(Integer.valueOf(2), ArrayUtil.get(o, 0)); @@ -759,7 +781,7 @@ public class BeanUtilTest { @Test public void issueI41WKPTest(){ - final Test1 t1 = new Test1().setStrList(ListUtil.toList("list")); + final Test1 t1 = new Test1().setStrList(ListUtil.of("list")); final Test2 t2_hu = new Test2(); BeanUtil.copyProperties(t1, t2_hu, CopyOptions.create().setIgnoreError(true)); Assert.assertNull(t2_hu.getStrList()); diff --git a/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java index e3b6562bd..5c1eed21e 100755 --- a/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java @@ -35,22 +35,22 @@ public class CollUtilTest { @Test public void testPredicateContains() { - final ArrayList list = CollUtil.newArrayList("bbbbb", "aaaaa", "ccccc"); + final ArrayList list = ListUtil.of("bbbbb", "aaaaa", "ccccc"); Assert.assertTrue(CollUtil.contains(list, s -> s.startsWith("a"))); Assert.assertFalse(CollUtil.contains(list, s -> s.startsWith("d"))); } @Test public void testRemoveWithAddIf() { - ArrayList list = CollUtil.newArrayList(1, 2, 3); - final ArrayList exceptRemovedList = CollUtil.newArrayList(2, 3); - final ArrayList exceptResultList = CollUtil.newArrayList(1); + ArrayList list = ListUtil.of(1, 2, 3); + final ArrayList exceptRemovedList = ListUtil.of(2, 3); + final ArrayList exceptResultList = ListUtil.of(1); List resultList = CollUtil.removeWithAddIf(list, ele -> 1 == ele); Assert.assertEquals(list, exceptRemovedList); Assert.assertEquals(resultList, exceptResultList); - list = CollUtil.newArrayList(1, 2, 3); + list = ListUtil.of(1, 2, 3); resultList = new ArrayList<>(); CollUtil.removeWithAddIf(list, resultList, ele -> 1 == ele); Assert.assertEquals(list, exceptRemovedList); @@ -59,27 +59,27 @@ public class CollUtilTest { @Test public void testPadLeft() { - List srcList = CollUtil.newArrayList(); - List answerList = CollUtil.newArrayList("a", "b"); + List srcList = ListUtil.of(); + List answerList = ListUtil.of("a", "b"); CollUtil.padLeft(srcList, 1, "b"); CollUtil.padLeft(srcList, 2, "a"); Assert.assertEquals(srcList, answerList); - srcList = CollUtil.newArrayList("a", "b"); - answerList = CollUtil.newArrayList("a", "b"); + srcList = ListUtil.of("a", "b"); + answerList = ListUtil.of("a", "b"); CollUtil.padLeft(srcList, 2, "a"); Assert.assertEquals(srcList, answerList); - srcList = CollUtil.newArrayList("c"); - answerList = CollUtil.newArrayList("a", "a", "c"); + srcList = ListUtil.of("c"); + answerList = ListUtil.of("a", "a", "c"); CollUtil.padLeft(srcList, 3, "a"); Assert.assertEquals(srcList, answerList); } @Test public void testPadRight() { - final List srcList = CollUtil.newArrayList("a"); - final List answerList = CollUtil.newArrayList("a", "b", "b", "b", "b"); + final List srcList = ListUtil.of("a"); + final List answerList = ListUtil.of("a", "b", "b", "b", "b"); CollUtil.padRight(srcList, 5, "b"); Assert.assertEquals(srcList, answerList); } @@ -91,7 +91,7 @@ public class CollUtilTest { @Test public void newHashSetTest() { - final Set set = CollUtil.newHashSet((String[]) null); + final Set set = SetUtil.of((String[]) null); Assert.assertNotNull(set); } @@ -114,8 +114,8 @@ public class CollUtilTest { @Test public void unionTest() { - final ArrayList list1 = CollUtil.newArrayList("a", "b", "b", "c", "d", "x"); - final ArrayList list2 = CollUtil.newArrayList("a", "b", "b", "b", "c", "d"); + final ArrayList list1 = ListUtil.of("a", "b", "b", "c", "d", "x"); + final ArrayList list2 = ListUtil.of("a", "b", "b", "b", "c", "d"); final Collection union = CollUtil.union(list1, list2); @@ -124,8 +124,8 @@ public class CollUtilTest { @Test public void intersectionTest() { - final ArrayList list1 = CollUtil.newArrayList("a", "b", "b", "c", "d", "x"); - final ArrayList list2 = CollUtil.newArrayList("a", "b", "b", "b", "c", "d"); + final ArrayList list1 = ListUtil.of("a", "b", "b", "c", "d", "x"); + final ArrayList list2 = ListUtil.of("a", "b", "b", "b", "c", "d"); final Collection intersection = CollUtil.intersection(list1, list2); Assert.assertEquals(2, CollUtil.count(intersection, "b"::equals)); @@ -133,12 +133,12 @@ public class CollUtilTest { @Test public void intersectionDistinctTest() { - final ArrayList list1 = CollUtil.newArrayList("a", "b", "b", "c", "d", "x"); - final ArrayList list2 = CollUtil.newArrayList("a", "b", "b", "b", "c", "d"); - final ArrayList list3 = CollUtil.newArrayList(); + final ArrayList list1 = ListUtil.of("a", "b", "b", "c", "d", "x"); + final ArrayList list2 = ListUtil.of("a", "b", "b", "b", "c", "d"); + final ArrayList list3 = ListUtil.of(); final Collection intersectionDistinct = CollUtil.intersectionDistinct(list1, list2); - Assert.assertEquals(CollUtil.newLinkedHashSet("a", "b", "c", "d"), intersectionDistinct); + Assert.assertEquals(SetUtil.ofLinked("a", "b", "c", "d"), intersectionDistinct); final Collection intersectionDistinct2 = CollUtil.intersectionDistinct(list1, list2, list3); Assert.assertTrue(intersectionDistinct2.isEmpty()); @@ -146,8 +146,8 @@ public class CollUtilTest { @Test public void disjunctionTest() { - final ArrayList list1 = CollUtil.newArrayList("a", "b", "b", "c", "d", "x"); - final ArrayList list2 = CollUtil.newArrayList("a", "b", "b", "b", "c", "d", "x2"); + final ArrayList list1 = ListUtil.of("a", "b", "b", "c", "d", "x"); + final ArrayList list2 = ListUtil.of("a", "b", "b", "b", "c", "d", "x2"); final Collection disjunction = CollUtil.disjunction(list1, list2); Assert.assertTrue(disjunction.contains("b")); @@ -163,8 +163,8 @@ public class CollUtilTest { @Test public void disjunctionTest2() { // 任意一个集合为空,差集为另一个集合 - final ArrayList list1 = CollUtil.newArrayList(); - final ArrayList list2 = CollUtil.newArrayList("a", "b", "b", "b", "c", "d", "x2"); + final ArrayList list1 = ListUtil.of(); + final ArrayList list2 = ListUtil.of("a", "b", "b", "b", "c", "d", "x2"); final Collection disjunction = CollUtil.disjunction(list1, list2); Assert.assertEquals(list2, disjunction); @@ -175,8 +175,8 @@ public class CollUtilTest { @Test public void disjunctionTest3() { // 无交集下返回共同的元素 - final ArrayList list1 = CollUtil.newArrayList("1", "2", "3"); - final ArrayList list2 = CollUtil.newArrayList("a", "b", "c"); + final ArrayList list1 = ListUtil.of("1", "2", "3"); + final ArrayList list2 = ListUtil.of("a", "b", "c"); final Collection disjunction = CollUtil.disjunction(list1, list2); Assert.assertTrue(disjunction.contains("1")); @@ -196,8 +196,8 @@ public class CollUtilTest { @Test public void subtractTest() { - final List list1 = CollUtil.newArrayList("a", "b", "b", "c", "d", "x"); - final List list2 = CollUtil.newArrayList("a", "b", "b", "b", "c", "d", "x2"); + final List list1 = ListUtil.of("a", "b", "b", "c", "d", "x"); + final List list2 = ListUtil.of("a", "b", "b", "b", "c", "d", "x2"); final Collection subtract = CollUtil.subtract(list1, list2); Assert.assertEquals(1, subtract.size()); Assert.assertEquals("x", subtract.iterator().next()); @@ -236,7 +236,7 @@ public class CollUtilTest { map2.put("c", "值3"); // ---------------------------------------------------------------------------------------- - final ArrayList> list = CollUtil.newArrayList(map1, map2); + final ArrayList> list = ListUtil.of(map1, map2); final Map> map = CollUtil.toListMap(list); Assert.assertEquals("值1", map.get("a").get(0)); Assert.assertEquals("值2", map.get("a").get(1)); @@ -251,7 +251,7 @@ public class CollUtilTest { public void getFieldValuesTest() { final Dict v1 = Dict.create().set("id", 12).set("name", "张三").set("age", 23); final Dict v2 = Dict.create().set("age", 13).set("id", 15).set("name", "李四"); - final ArrayList list = CollUtil.newArrayList(v1, v2); + final ArrayList list = ListUtil.of(v1, v2); final List fieldValues = CollUtil.getFieldValues(list, "name"); Assert.assertEquals("张三", fieldValues.get(0)); @@ -260,7 +260,7 @@ public class CollUtilTest { @Test public void splitTest() { - final ArrayList list = CollUtil.newArrayList(1, 2, 3, 4, 5, 6, 7, 8, 9); + final ArrayList list = ListUtil.of(1, 2, 3, 4, 5, 6, 7, 8, 9); final List> split = CollUtil.split(list, 3); Assert.assertEquals(3, split.size()); Assert.assertEquals(3, split.get(0).size()); @@ -285,35 +285,35 @@ public class CollUtilTest { @Test public void filterTest() { - final ArrayList list = CollUtil.newArrayList("a", "b", "c"); + final ArrayList list = ListUtil.of("a", "b", "c"); final Collection filtered = CollUtil.edit(list, t -> t + 1); - Assert.assertEquals(CollUtil.newArrayList("a1", "b1", "c1"), filtered); + Assert.assertEquals(ListUtil.of("a1", "b1", "c1"), filtered); } @Test public void filterTest2() { - final ArrayList list = CollUtil.newArrayList("a", "b", "c"); + final ArrayList list = ListUtil.of("a", "b", "c"); final ArrayList filtered = CollUtil.filter(list, t -> false == "a".equals(t)); // 原地过滤 Assert.assertSame(list, filtered); - Assert.assertEquals(CollUtil.newArrayList("b", "c"), filtered); + Assert.assertEquals(ListUtil.of("b", "c"), filtered); } @Test public void filterSetTest() { - final Set set = CollUtil.newLinkedHashSet("a", "b", "", " ", "c"); + final Set set = SetUtil.ofLinked("a", "b", "", " ", "c"); final Set filtered = CollUtil.filter(set, StrUtil::isNotBlank); - Assert.assertEquals(CollUtil.newLinkedHashSet("a", "b", "c"), filtered); + Assert.assertEquals(SetUtil.ofLinked("a", "b", "c"), filtered); } @Test public void filterRemoveTest() { - final ArrayList list = CollUtil.newArrayList("a", "b", "c"); + final ArrayList list = ListUtil.of("a", "b", "c"); final List removed = new ArrayList<>(); final ArrayList filtered = CollUtil.filter(list, t -> { @@ -329,45 +329,45 @@ public class CollUtilTest { // 原地过滤 Assert.assertSame(list, filtered); - Assert.assertEquals(CollUtil.newArrayList("b", "c"), filtered); + Assert.assertEquals(ListUtil.of("b", "c"), filtered); } @Test public void removeNullTest() { - final ArrayList list = CollUtil.newArrayList("a", "b", "c", null, "", " "); + final ArrayList list = ListUtil.of("a", "b", "c", null, "", " "); final ArrayList filtered = CollUtil.removeNull(list); // 原地过滤 Assert.assertSame(list, filtered); - Assert.assertEquals(CollUtil.newArrayList("a", "b", "c", "", " "), filtered); + Assert.assertEquals(ListUtil.of("a", "b", "c", "", " "), filtered); } @Test public void removeEmptyTest() { - final ArrayList list = CollUtil.newArrayList("a", "b", "c", null, "", " "); + final ArrayList list = ListUtil.of("a", "b", "c", null, "", " "); final ArrayList filtered = CollUtil.removeEmpty(list); // 原地过滤 Assert.assertSame(list, filtered); - Assert.assertEquals(CollUtil.newArrayList("a", "b", "c", " "), filtered); + Assert.assertEquals(ListUtil.of("a", "b", "c", " "), filtered); } @Test public void removeBlankTest() { - final ArrayList list = CollUtil.newArrayList("a", "b", "c", null, "", " "); + final ArrayList list = ListUtil.of("a", "b", "c", null, "", " "); final ArrayList filtered = CollUtil.removeBlank(list); // 原地过滤 Assert.assertSame(list, filtered); - Assert.assertEquals(CollUtil.newArrayList("a", "b", "c"), filtered); + Assert.assertEquals(ListUtil.of("a", "b", "c"), filtered); } @Test public void groupTest() { - final List list = CollUtil.newArrayList("1", "2", "3", "4", "5", "6"); + final List list = ListUtil.of("1", "2", "3", "4", "5", "6"); final List> group = CollUtil.group(list, null); Assert.assertTrue(group.size() > 0); @@ -375,13 +375,13 @@ public class CollUtilTest { // 按照奇数偶数分类 return Integer.parseInt(t) % 2; }); - Assert.assertEquals(CollUtil.newArrayList("2", "4", "6"), group2.get(0)); - Assert.assertEquals(CollUtil.newArrayList("1", "3", "5"), group2.get(1)); + Assert.assertEquals(ListUtil.of("2", "4", "6"), group2.get(0)); + Assert.assertEquals(ListUtil.of("1", "3", "5"), group2.get(1)); } @Test public void groupByFieldTest() { - final List list = CollUtil.newArrayList(new TestBean("张三", 12), new TestBean("李四", 13), new TestBean("王五", 12)); + final List list = ListUtil.of(new TestBean("张三", 12), new TestBean("李四", 13), new TestBean("王五", 12)); final List> groupByField = CollUtil.groupByField(list, "age"); Assert.assertEquals("张三", groupByField.get(0).get(0).getName()); Assert.assertEquals("王五", groupByField.get(0).get(1).getName()); @@ -391,7 +391,7 @@ public class CollUtilTest { @Test public void sortByPropertyTest() { - final List list = CollUtil.newArrayList( + final List list = ListUtil.of( new TestBean("张三", 12, DateUtil.parse("2018-05-01")), // new TestBean("李四", 13, DateUtil.parse("2018-03-01")), // new TestBean("王五", 12, DateUtil.parse("2018-04-01"))// @@ -405,7 +405,7 @@ public class CollUtilTest { @Test public void sortByPropertyTest2() { - final List list = CollUtil.newArrayList( + final List list = ListUtil.of( new TestBean("张三", 0, DateUtil.parse("2018-05-01")), // new TestBean("李四", -12, DateUtil.parse("2018-03-01")), // new TestBean("王五", 23, DateUtil.parse("2018-04-01"))// @@ -419,7 +419,7 @@ public class CollUtilTest { @Test public void fieldValueMapTest() { - final List list = CollUtil.newArrayList(new TestBean("张三", 12, DateUtil.parse("2018-05-01")), // + final List list = ListUtil.of(new TestBean("张三", 12, DateUtil.parse("2018-05-01")), // new TestBean("李四", 13, DateUtil.parse("2018-03-01")), // new TestBean("王五", 12, DateUtil.parse("2018-04-01"))// ); @@ -432,7 +432,7 @@ public class CollUtilTest { @Test public void fieldValueAsMapTest() { - final List list = CollUtil.newArrayList(new TestBean("张三", 12, DateUtil.parse("2018-05-01")), // + final List list = ListUtil.of(new TestBean("张三", 12, DateUtil.parse("2018-05-01")), // new TestBean("李四", 13, DateUtil.parse("2018-03-01")), // new TestBean("王五", 14, DateUtil.parse("2018-04-01"))// ); @@ -470,8 +470,8 @@ public class CollUtilTest { @Test public void listTest() { - final List list1 = CollUtil.list(false); - final List list2 = CollUtil.list(true); + final List list1 = ListUtil.of(false); + final List list2 = ListUtil.of(true); Assert.assertTrue(list1 instanceof ArrayList); Assert.assertTrue(list2 instanceof LinkedList); @@ -479,8 +479,8 @@ public class CollUtilTest { @Test public void listTest2() { - final List list1 = CollUtil.list(false, "a", "b", "c"); - final List list2 = CollUtil.list(true, "a", "b", "c"); + final List list1 = ListUtil.of( "a", "b", "c"); + final List list2 = ListUtil.ofLinked( "a", "b", "c"); Assert.assertEquals("[a, b, c]", list1.toString()); Assert.assertEquals("[a, b, c]", list2.toString()); } @@ -492,15 +492,15 @@ public class CollUtilTest { set.add("b"); set.add("c"); - final List list1 = CollUtil.list(false, set); - final List list2 = CollUtil.list(true, set); + final List list1 = ListUtil.of(false, set); + final List list2 = ListUtil.of(true, set); Assert.assertEquals("[a, b, c]", list1.toString()); Assert.assertEquals("[a, b, c]", list2.toString()); } @Test public void getTest() { - final HashSet set = CollUtil.set(true, "A", "B", "C", "D"); + final HashSet set = SetUtil.ofLinked("A", "B", "C", "D"); String str = CollUtil.get(set, 2); Assert.assertEquals("C", str); @@ -701,43 +701,43 @@ public class CollUtilTest { @Test public void sortPageAllTest() { - final List list = CollUtil.newArrayList(1, 2, 3, 4, 5, 6, 7, 8, 9); + final List list = ListUtil.of(1, 2, 3, 4, 5, 6, 7, 8, 9); final List sortPageAll = CollUtil.sortPageAll(1, 5, Comparator.reverseOrder(), list); - Assert.assertEquals(CollUtil.newArrayList(4, 3, 2, 1), sortPageAll); + Assert.assertEquals(ListUtil.of(4, 3, 2, 1), sortPageAll); } @Test public void containsAnyTest() { - final ArrayList list1 = CollUtil.newArrayList(1, 2, 3, 4, 5); - final ArrayList list2 = CollUtil.newArrayList(5, 3, 1, 9, 11); + final ArrayList list1 = ListUtil.of(1, 2, 3, 4, 5); + final ArrayList list2 = ListUtil.of(5, 3, 1, 9, 11); Assert.assertTrue(CollUtil.containsAny(list1, list2)); } @Test public void containsAllTest() { - final ArrayList list1 = CollUtil.newArrayList(1, 2, 3, 4, 5); - final ArrayList list2 = CollUtil.newArrayList(5, 3, 1); + final ArrayList list1 = ListUtil.of(1, 2, 3, 4, 5); + final ArrayList list2 = ListUtil.of(5, 3, 1); Assert.assertTrue(CollUtil.containsAll(list1, list2)); - final ArrayList list3 = CollUtil.newArrayList(1); - final ArrayList list4 = CollUtil.newArrayList(); + final ArrayList list3 = ListUtil.of(1); + final ArrayList list4 = ListUtil.of(); Assert.assertTrue(CollUtil.containsAll(list3, list4)); } @Test public void getLastTest() { // 测试:空数组返回null而不是报错 - final List test = CollUtil.newArrayList(); + final List test = ListUtil.of(); final String last = CollUtil.getLast(test); Assert.assertNull(last); } @Test public void zipTest() { - final Collection keys = CollUtil.newArrayList("a", "b", "c", "d"); - final Collection values = CollUtil.newArrayList(1, 2, 3, 4); + final Collection keys = ListUtil.of("a", "b", "c", "d"); + final Collection values = ListUtil.of(1, 2, 3, 4); final Map map = CollUtil.zip(keys, values); @@ -751,7 +751,7 @@ public class CollUtilTest { @Test public void toMapTest() { - final Collection keys = CollUtil.newArrayList("a", "b", "c", "d"); + final Collection keys = ListUtil.of("a", "b", "c", "d"); final Map map = CollUtil.toMap(keys, new HashMap<>(), (value) -> "key" + value); Assert.assertEquals("a", map.get("keya")); Assert.assertEquals("b", map.get("keyb")); @@ -778,7 +778,7 @@ public class CollUtilTest { @Test public void countMapTest() { - final ArrayList list = CollUtil.newArrayList("a", "b", "c", "c", "a", "b", "d"); + final ArrayList list = ListUtil.of("a", "b", "c", "c", "a", "b", "d"); final Map countMap = CollUtil.countMap(list); Assert.assertEquals(Integer.valueOf(2), countMap.get("a")); @@ -789,7 +789,7 @@ public class CollUtilTest { @Test public void indexOfTest() { - final ArrayList list = CollUtil.newArrayList("a", "b", "c", "c", "a", "b", "d"); + final ArrayList list = ListUtil.of("a", "b", "c", "c", "a", "b", "d"); final int i = CollUtil.indexOf(list, (str) -> str.charAt(0) == 'c'); Assert.assertEquals(2, i); } @@ -797,14 +797,14 @@ public class CollUtilTest { @Test public void lastIndexOfTest() { // List有优化 - final ArrayList list = CollUtil.newArrayList("a", "b", "c", "c", "a", "b", "d"); + final ArrayList list = ListUtil.of("a", "b", "c", "c", "a", "b", "d"); final int i = CollUtil.lastIndexOf(list, (str) -> str.charAt(0) == 'c'); Assert.assertEquals(3, i); } @Test public void lastIndexOfSetTest() { - final Set list = CollUtil.set(true, "a", "b", "c", "c", "a", "b", "d"); + final Set list = SetUtil.ofLinked("a", "b", "c", "c", "a", "b", "d"); // 去重后c排第三 final int i = CollUtil.lastIndexOf(list, (str) -> str.charAt(0) == 'c'); Assert.assertEquals(2, i); @@ -812,7 +812,7 @@ public class CollUtilTest { @Test public void pageTest() { - final List objects = CollUtil.newArrayList(); + final List objects = ListUtil.of(); for (int i = 0; i < 10; i++) { objects.add(Dict.create().set("name", "姓名:" + i)); } @@ -832,7 +832,7 @@ public class CollUtilTest { @Test public void sortComparableTest() { - final List of = ListUtil.toList("a", "c", "b"); + final List of = ListUtil.of("a", "c", "b"); final List sort = CollUtil.sort(of, new ComparableComparator<>()); Assert.assertEquals("a,b,c", CollUtil.join(sort, ",")); } @@ -880,8 +880,8 @@ public class CollUtilTest { @Test public void distinctTest(){ - final ArrayList distinct = CollUtil.distinct(ListUtil.of(5, 3, 10, 9, 0, 5, 10, 9)); - Assert.assertEquals(ListUtil.of(5, 3, 10, 9, 0), distinct); + final ArrayList distinct = CollUtil.distinct(ListUtil.view(5, 3, 10, 9, 0, 5, 10, 9)); + Assert.assertEquals(ListUtil.view(5, 3, 10, 9, 0), distinct); } @Test diff --git a/hutool-core/src/test/java/cn/hutool/core/collection/IterUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/collection/IterUtilTest.java index f642764c9..da5c3da35 100644 --- a/hutool-core/src/test/java/cn/hutool/core/collection/IterUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/collection/IterUtilTest.java @@ -17,20 +17,20 @@ import java.util.Map; /** * {@link IterUtil} 单元测试 - * @author looly * + * @author looly */ public class IterUtilTest { @Test - public void getFirstNonNullTest(){ - final ArrayList strings = CollUtil.newArrayList(null, null, "123", "456", null); + public void getFirstNonNullTest() { + final ArrayList strings = ListUtil.of(null, null, "123", "456", null); Assert.assertEquals("123", IterUtil.getFirstNoneNull(strings)); } @Test public void fieldValueMapTest() { - final ArrayList carList = CollUtil.newArrayList(new Car("123", "大众"), new Car("345", "奔驰"), new Car("567", "路虎")); + final ArrayList carList = ListUtil.of(new Car("123", "大众"), new Car("345", "奔驰"), new Car("567", "路虎")); final Map carNameMap = IterUtil.fieldValueMap(carList.iterator(), "carNumber"); Assert.assertEquals("大众", carNameMap.get("123").getCarName()); @@ -40,30 +40,30 @@ public class IterUtilTest { @Test public void joinTest() { - final ArrayList list = CollUtil.newArrayList("1", "2", "3", "4"); + final ArrayList list = ListUtil.of("1", "2", "3", "4"); final String join = IterUtil.join(list.iterator(), ":"); Assert.assertEquals("1:2:3:4", join); - final ArrayList list1 = CollUtil.newArrayList(1, 2, 3, 4); + final ArrayList list1 = ListUtil.of(1, 2, 3, 4); final String join1 = IterUtil.join(list1.iterator(), ":"); Assert.assertEquals("1:2:3:4", join1); // 包装每个节点 - final ArrayList list2 = CollUtil.newArrayList("1", "2", "3", "4"); + final ArrayList list2 = ListUtil.of("1", "2", "3", "4"); final String join2 = IterUtil.join(list2.iterator(), ":", "\"", "\""); Assert.assertEquals("\"1\":\"2\":\"3\":\"4\"", join2); } @Test public void joinWithFuncTest() { - final ArrayList list = CollUtil.newArrayList("1", "2", "3", "4"); + final ArrayList list = ListUtil.of("1", "2", "3", "4"); final String join = IterUtil.join(list.iterator(), ":", String::valueOf); Assert.assertEquals("1:2:3:4", join); } @Test public void joinWithNullTest() { - final ArrayList list = CollUtil.newArrayList("1", null, "3", "4"); + final ArrayList list = ListUtil.of("1", null, "3", "4"); final String join = IterUtil.join(list.iterator(), ":", String::valueOf); Assert.assertEquals("1:null:3:4", join); } @@ -94,10 +94,10 @@ public class IterUtilTest { } @Test - public void getElementTypeTest(){ + public void getElementTypeTest() { final List integers = Arrays.asList(null, 1); final Class elementType = IterUtil.getElementType(integers); - Assert.assertEquals(Integer.class,elementType); + Assert.assertEquals(Integer.class, elementType); } @Data @@ -108,9 +108,9 @@ public class IterUtilTest { } @Test - public void filterTest(){ - final List obj2 = ListUtil.toList("3"); - final List obj = ListUtil.toList("1", "3"); + public void filterTest() { + final List obj2 = ListUtil.of("3"); + final List obj = ListUtil.of("1", "3"); IterUtil.filter(obj.iterator(), obj2::contains); @@ -119,9 +119,9 @@ public class IterUtilTest { } @Test - public void filteredTest(){ - final List obj2 = ListUtil.toList("3"); - final List obj = ListUtil.toList("1", "3"); + public void filteredTest() { + final List obj2 = ListUtil.of("3"); + final List obj = ListUtil.of("1", "3"); final FilterIter filtered = IterUtil.filtered(obj.iterator(), obj2::contains); @@ -130,9 +130,9 @@ public class IterUtilTest { } @Test - public void filterToListTest(){ - final List obj2 = ListUtil.toList("3"); - final List obj = ListUtil.toList("1", "3"); + public void filterToListTest() { + final List obj2 = ListUtil.of("3"); + final List obj = ListUtil.of("1", "3"); final List filtered = IterUtil.filterToList(obj.iterator(), obj2::contains); @@ -142,7 +142,7 @@ public class IterUtilTest { @Test public void getTest() { - final HashSet set = CollUtil.set(true, "A", "B", "C", "D"); + final HashSet set = SetUtil.ofLinked("A", "B", "C", "D"); final String str = IterUtil.get(set.iterator(), 2); Assert.assertEquals("C", str); } diff --git a/hutool-core/src/test/java/cn/hutool/core/collection/ListUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/collection/ListUtilTest.java index b7e5380e0..497b66b34 100644 --- a/hutool-core/src/test/java/cn/hutool/core/collection/ListUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/collection/ListUtilTest.java @@ -87,7 +87,7 @@ public class ListUtilTest { @Test public void editTest() { - final List a = ListUtil.toLinkedList("1", "2", "3"); + final List a = ListUtil.ofLinked("1", "2", "3"); final List filter = (List) CollUtil.edit(a, str -> "edit" + str); Assert.assertEquals("edit1", filter.get(0)); Assert.assertEquals("edit2", filter.get(1)); @@ -96,16 +96,16 @@ public class ListUtilTest { @Test public void indexOfAll() { - final List a = ListUtil.toLinkedList("1", "2", "3", "4", "3", "2", "1"); - final int[] indexArray = ListUtil.indexOfAll(a, "2"::equals); + final List a = ListUtil.ofLinked("1", "2", "3", "4", "3", "2", "1"); + final int[] indexArray = CollUtil.indexOfAll(a, "2"::equals); Assert.assertArrayEquals(new int[]{1,5}, indexArray); - final int[] indexArray2 = ListUtil.indexOfAll(a, "1"::equals); + final int[] indexArray2 = CollUtil.indexOfAll(a, "1"::equals); Assert.assertArrayEquals(new int[]{0,6}, indexArray2); } @Test public void pageTest() { - final List a = ListUtil.toLinkedList(1, 2, 3,4,5); + final List a = ListUtil.ofLinked(1, 2, 3,4,5); PageUtil.setFirstPageNo(1); final int[] a_1 = ListUtil.page(1,2,a).stream().mapToInt(Integer::valueOf).toArray(); @@ -174,7 +174,7 @@ public class ListUtilTest { @Test public void subTest() { - final List of = ListUtil.of(1, 2, 3, 4); + final List of = ListUtil.view(1, 2, 3, 4); final List sub = ListUtil.sub(of, 2, 4); sub.remove(0); @@ -192,7 +192,7 @@ public class ListUtilTest { private String name; } - final List beanList = ListUtil.toList( + final List beanList = ListUtil.of( new TestBean(2, "test2"), new TestBean(1, "test1"), new TestBean(5, "test5"), diff --git a/hutool-core/src/test/java/cn/hutool/core/collection/PartitionIterTest.java b/hutool-core/src/test/java/cn/hutool/core/collection/PartitionIterTest.java index b84b5fbfb..e4c02049c 100644 --- a/hutool-core/src/test/java/cn/hutool/core/collection/PartitionIterTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/collection/PartitionIterTest.java @@ -22,7 +22,7 @@ public class PartitionIterTest { @Test public void iterMaxTest() { - final List list = ListUtil.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 0, 12, 45, 12); + final List list = ListUtil.view(1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 0, 12, 45, 12); final PartitionIter iter = new PartitionIter<>(list.iterator(), 3); int max = 0; for (final List lines : iter) { diff --git a/hutool-core/src/test/java/cn/hutool/core/comparator/CompareUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/comparator/CompareUtilTest.java index 1b4611580..1a490c0f8 100644 --- a/hutool-core/src/test/java/cn/hutool/core/comparator/CompareUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/comparator/CompareUtilTest.java @@ -19,10 +19,10 @@ public class CompareUtilTest { @Test public void comparingPinyin() { - final List list = ListUtil.toList("成都", "北京", "上海", "深圳"); + final List list = ListUtil.of("成都", "北京", "上海", "深圳"); - final List ascendingOrderResult = ListUtil.of("北京", "成都", "上海", "深圳"); - final List descendingOrderResult = ListUtil.of("深圳", "上海", "成都", "北京"); + final List ascendingOrderResult = ListUtil.view("北京", "成都", "上海", "深圳"); + final List descendingOrderResult = ListUtil.view("深圳", "上海", "成都", "北京"); // 正序 list.sort(CompareUtil.comparingPinyin(e -> e)); diff --git a/hutool-core/src/test/java/cn/hutool/core/compiler/JavaSourceCompilerTest.java b/hutool-core/src/test/java/cn/hutool/core/compiler/JavaSourceCompilerTest.java index 66032d9dc..ce97e0236 100644 --- a/hutool-core/src/test/java/cn/hutool/core/compiler/JavaSourceCompilerTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/compiler/JavaSourceCompilerTest.java @@ -2,8 +2,10 @@ package cn.hutool.core.compiler; import cn.hutool.core.compress.ZipUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.lang.Console; import cn.hutool.core.reflect.ConstructorUtil; import org.junit.Assert; +import org.junit.Ignore; import org.junit.Test; import java.io.File; @@ -16,6 +18,13 @@ import java.io.InputStream; */ public class JavaSourceCompilerTest { + @Test + @Ignore + public void compilerATest(){ + final boolean compile = CompilerUtil.compile(FileUtil.file("test-compile/a/A.java").getAbsolutePath()); + Assert.assertTrue(compile); + } + /** * 测试编译Java源码 */ @@ -29,6 +38,7 @@ public class JavaSourceCompilerTest { FileUtil.getInputStream("test-compile/a/A$1.class"), FileUtil.getInputStream("test-compile/a/A$InnerClass.class") }); + Console.log(libFile.getAbsolutePath()); final ClassLoader classLoader = CompilerUtil.getCompiler(null) .addSource(FileUtil.file("test-compile/b/B.java")) .addSource("c.C", FileUtil.readUtf8String("test-compile/c/C.java")) diff --git a/hutool-core/src/test/java/cn/hutool/core/convert/CastUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/convert/CastUtilTest.java new file mode 100644 index 000000000..d67aaebad --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/convert/CastUtilTest.java @@ -0,0 +1,46 @@ +package cn.hutool.core.convert; + +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.collection.SetUtil; +import org.junit.Assert; +import org.junit.Test; + +import java.io.Serializable; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class CastUtilTest { + @Test + public void testCastToSuper() { + Collection collection= ListUtil.of(1,2,3); + List list = ListUtil.of(1, 2, 3); + Set set = SetUtil.of(1, 2, 3); + Map map = new HashMap<>(); + map.put(1, 1); + + Collection collection2 = CastUtil.castUp(collection); + collection2.add(new Double("123.1")); + Assert.assertSame(collection, collection2); + + Collection collection3 = CastUtil.castDown(collection2); + Assert.assertSame(collection2, collection3); + + List list2 = CastUtil.castUp(list); + Assert.assertSame(list, list2); + List list3 = CastUtil.castDown(list2); + Assert.assertSame(list2, list3); + + Set set2 = CastUtil.castUp(set); + Assert.assertSame(set, set2); + Set set3 = CastUtil.castDown(set2); + Assert.assertSame(set2, set3); + + Map map2 = CastUtil.castUp(map); + Assert.assertSame(map, map2); + Map map3 = CastUtil.castDown(map2); + Assert.assertSame(map2, map3); + } +} diff --git a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java index 67c7999d7..8c1e06224 100755 --- a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java @@ -1,12 +1,12 @@ package cn.hutool.core.convert; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.codec.HexUtil; +import cn.hutool.core.collection.SetUtil; import cn.hutool.core.date.DateException; import cn.hutool.core.date.DateUtil; -import cn.hutool.core.reflect.TypeReference; import cn.hutool.core.map.MapUtil; +import cn.hutool.core.reflect.TypeReference; import cn.hutool.core.util.ByteUtil; -import cn.hutool.core.codec.HexUtil; import lombok.AllArgsConstructor; import lombok.Data; import lombok.Getter; @@ -15,6 +15,8 @@ import org.junit.Test; import java.io.Serializable; import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; @@ -293,7 +295,7 @@ public class ConvertTest { public void toSetTest(){ final Set result = Convert.convert(new TypeReference>() { }, "1,2,3"); - Assert.assertEquals(CollUtil.set(false, 1,2,3), result); + Assert.assertEquals(SetUtil.of(1,2,3), result); } @Getter @@ -383,4 +385,11 @@ public class ConvertTest { final float b = Convert.toFloat(a); Assert.assertEquals(a, b, 5); } + + @Test + public void localDateTimeToLocalDateTest(){ + final LocalDateTime localDateTime = LocalDateTime.now(); + final LocalDate convert = Convert.convert(LocalDate.class, localDateTime); + Assert.assertEquals(localDateTime.toLocalDate(), convert); + } } diff --git a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertToCollectionTest.java b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertToCollectionTest.java index 570c913af..b3b1b6622 100755 --- a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertToCollectionTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertToCollectionTest.java @@ -1,6 +1,6 @@ package cn.hutool.core.convert; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.reflect.TypeReference; import org.junit.Assert; import org.junit.Test; @@ -128,7 +128,7 @@ public class ConvertToCollectionTest { public void toSetTest() { final Object[] a = { "a", "你", "好", "", 1 }; final LinkedHashSet set = Convert.convert(LinkedHashSet.class, a); - final ArrayList list = CollUtil.newArrayList(set); + final ArrayList list = ListUtil.of(set); Assert.assertEquals("a", list.get(0)); Assert.assertEquals("你", list.get(1)); Assert.assertEquals("好", list.get(2)); diff --git a/hutool-core/src/test/java/cn/hutool/core/convert/NumberWordFormatTest.java b/hutool-core/src/test/java/cn/hutool/core/convert/NumberWordFormatTest.java index 64acfad96..7b39d1a9f 100644 --- a/hutool-core/src/test/java/cn/hutool/core/convert/NumberWordFormatTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/convert/NumberWordFormatTest.java @@ -31,4 +31,10 @@ public class NumberWordFormatTest { final String format5 = NumberWordFormatter.formatSimple(438); Assert.assertEquals("438", format5); } + + @Test + public void formatSimpleTest2(){ + final String s = NumberWordFormatter.formatSimple(1000); + Assert.assertEquals("1k", s); + } } diff --git a/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java index 9537b1a44..48efc9eaa 100755 --- a/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java @@ -1,6 +1,6 @@ package cn.hutool.core.date; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.date.BetweenFormatter.Level; import cn.hutool.core.date.format.FastDateFormat; import cn.hutool.core.lang.Console; @@ -800,13 +800,13 @@ public class DateUtilTest { Assert.assertEquals("20184", yearAndQuarter); final LinkedHashSet yearAndQuarters = DateUtil.yearAndQuarter(DateUtil.parse("2018-09-10"), DateUtil.parse("2018-12-20")); - final List list = CollUtil.list(false, yearAndQuarters); + final List list = ListUtil.of(false, yearAndQuarters); Assert.assertEquals(2, list.size()); Assert.assertEquals("20183", list.get(0)); Assert.assertEquals("20184", list.get(1)); final LinkedHashSet yearAndQuarters2 = DateUtil.yearAndQuarter(DateUtil.parse("2018-10-10"), DateUtil.parse("2018-12-10")); - final List list2 = CollUtil.list(false, yearAndQuarters2); + final List list2 = ListUtil.of(false, yearAndQuarters2); Assert.assertEquals(1, list2.size()); Assert.assertEquals("20184", list2.get(0)); } diff --git a/hutool-core/src/test/java/cn/hutool/core/io/FileUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/io/FileUtilTest.java index a08c44cfb..01b28ba54 100644 --- a/hutool-core/src/test/java/cn/hutool/core/io/FileUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/io/FileUtilTest.java @@ -465,7 +465,7 @@ public class FileUtilTest { @Test @Ignore public void appendLinesTest(){ - final List list = ListUtil.toList("a", "b", "c"); + final List list = ListUtil.of("a", "b", "c"); FileUtil.appendLines(list, FileUtil.file("d:/test/appendLines.txt"), CharsetUtil.UTF_8); } diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/DictTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/DictTest.java index 91ef894bb..d69d827f1 100755 --- a/hutool-core/src/test/java/cn/hutool/core/lang/DictTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/lang/DictTest.java @@ -37,7 +37,7 @@ public class DictTest { @Test public void ofTest(){ - final Dict dict = Dict.of( + final Dict dict = Dict.ofKvs( "RED", "#FF0000", "GREEN", "#00FF00", "BLUE", "#0000FF" @@ -50,11 +50,11 @@ public class DictTest { @Test public void removeEqualTest(){ - final Dict dict = Dict.of( + final Dict dict = Dict.ofKvs( "key1", null ); - final Dict dict2 = Dict.of( + final Dict dict2 = Dict.ofKvs( "key1", null ); diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/ValidatorTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/ValidatorTest.java index c44e7d9a4..75fc1b53d 100755 --- a/hutool-core/src/test/java/cn/hutool/core/lang/ValidatorTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/lang/ValidatorTest.java @@ -222,6 +222,7 @@ public class ValidatorTest { public void isCarVinTest(){ Assert.assertTrue(Validator.isCarVin("LSJA24U62JG269225")); Assert.assertTrue(Validator.isCarVin("LDC613P23A1305189")); + Assert.assertFalse(Validator.isCarVin("LOC613P23A1305189")); } @Test diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/WeightRandomTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/WeightRandomTest.java index 7b0c055f6..8f8bca881 100644 --- a/hutool-core/src/test/java/cn/hutool/core/lang/WeightRandomTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/lang/WeightRandomTest.java @@ -1,10 +1,9 @@ package cn.hutool.core.lang; +import cn.hutool.core.collection.ListUtil; import org.junit.Assert; import org.junit.Test; -import cn.hutool.core.collection.CollUtil; - public class WeightRandomTest { @Test @@ -15,6 +14,6 @@ public class WeightRandomTest { random.add("C", 100); final String result = random.next(); - Assert.assertTrue(CollUtil.newArrayList("A", "B", "C").contains(result)); + Assert.assertTrue(ListUtil.of("A", "B", "C").contains(result)); } } diff --git a/hutool-core/src/test/java/cn/hutool/core/map/CaseInsensitiveMapTest.java b/hutool-core/src/test/java/cn/hutool/core/map/CaseInsensitiveMapTest.java index 3a30258a5..8e572f0ca 100644 --- a/hutool-core/src/test/java/cn/hutool/core/map/CaseInsensitiveMapTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/map/CaseInsensitiveMapTest.java @@ -1,9 +1,10 @@ package cn.hutool.core.map; -import cn.hutool.core.lang.Pair; import org.junit.Assert; import org.junit.Test; +import java.util.Map; + public class CaseInsensitiveMapTest { @Test @@ -25,8 +26,8 @@ public class CaseInsensitiveMapTest { @Test public void mergeTest(){ //https://github.com/dromara/hutool/issues/2086 - final Pair b = new Pair<>("a", "value"); - final Pair a = new Pair<>("A", "value"); + final Map.Entry b = MapUtil.entry("a", "value"); + final Map.Entry a = MapUtil.entry("A", "value"); final CaseInsensitiveMap map = new CaseInsensitiveMap<>(); map.merge(b.getKey(), b.getValue(), (A, B) -> A); map.merge(a.getKey(), a.getValue(), (A, B) -> A); diff --git a/hutool-core/src/test/java/cn/hutool/core/text/StrJoinerTest.java b/hutool-core/src/test/java/cn/hutool/core/text/StrJoinerTest.java index 5de08352c..b666768a5 100644 --- a/hutool-core/src/test/java/cn/hutool/core/text/StrJoinerTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/text/StrJoinerTest.java @@ -1,7 +1,7 @@ package cn.hutool.core.text; -import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.collection.SetUtil; import org.junit.Assert; import org.junit.Test; @@ -33,8 +33,8 @@ public class StrJoinerTest { @Test public void joinMultiArrayTest(){ final StrJoiner append = StrJoiner.of(","); - append.append(new Object[]{ListUtil.of("1", "2"), - CollUtil.newLinkedHashSet("3", "4") + append.append(new Object[]{ListUtil.view("1", "2"), + SetUtil.ofLinked("3", "4") }); Assert.assertEquals("1,2,3,4", append.toString()); } diff --git a/hutool-core/src/test/java/cn/hutool/core/text/dfa/DfaTest.java b/hutool-core/src/test/java/cn/hutool/core/text/dfa/DfaTest.java index c1b076a2b..3847800db 100755 --- a/hutool-core/src/test/java/cn/hutool/core/text/dfa/DfaTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/text/dfa/DfaTest.java @@ -1,6 +1,6 @@ package cn.hutool.core.text.dfa; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import org.junit.Assert; import org.junit.Test; @@ -27,7 +27,7 @@ public class DfaTest { // 匹配到【大】,就不再继续匹配了,因此【大土豆】不匹配 // 匹配到【刚出锅】,就跳过这三个字了,因此【出锅】不匹配(由于刚首先被匹配,因此长的被匹配,最短匹配只针对第一个字相同选最短) final List matchAll = tree.matchAll(text, -1, false, false); - Assert.assertEquals(matchAll, CollUtil.newArrayList("大", "土^豆", "刚出锅")); + Assert.assertEquals(matchAll, ListUtil.of("大", "土^豆", "刚出锅")); } /** @@ -43,7 +43,7 @@ public class DfaTest { // 【大】被匹配,最短匹配原则【大土豆】被跳过,【土豆继续被匹配】 // 【刚出锅】被匹配,由于不跳过已经匹配的词,【出锅】被匹配 final List matchAll = tree.matchAll(text, -1, true, false); - Assert.assertEquals(matchAll, CollUtil.newArrayList("大", "土^豆", "刚出锅", "出锅")); + Assert.assertEquals(matchAll, ListUtil.of("大", "土^豆", "刚出锅", "出锅")); } /** @@ -59,7 +59,7 @@ public class DfaTest { // 匹配到【大】,由于非密集匹配,因此从下一个字符开始查找,匹配到【土豆】接着被匹配 // 由于【刚出锅】被匹配,由于非密集匹配,【出锅】被跳过 final List matchAll = tree.matchAll(text, -1, false, true); - Assert.assertEquals(matchAll, CollUtil.newArrayList("大", "土^豆", "刚出锅")); + Assert.assertEquals(matchAll, ListUtil.of("大", "土^豆", "刚出锅")); } @@ -76,7 +76,7 @@ public class DfaTest { // 匹配到【大】,由于到最长匹配,因此【大土豆】接着被匹配,由于不跳过已经匹配的关键词,土豆继续被匹配 // 【刚出锅】被匹配,由于不跳过已经匹配的词,【出锅】被匹配 final List matchAll = tree.matchAll(text, -1, true, true); - Assert.assertEquals(matchAll, CollUtil.newArrayList("大", "大土^豆", "土^豆", "刚出锅", "出锅")); + Assert.assertEquals(matchAll, ListUtil.of("大", "大土^豆", "土^豆", "刚出锅", "出锅")); } @@ -112,7 +112,7 @@ public class DfaTest { tree.addWord("tio"); final List all = tree.matchAll("AAAAAAAt-ioBBBBBBB"); - Assert.assertEquals(all, CollUtil.newArrayList("t-io")); + Assert.assertEquals(all, ListUtil.of("t-io")); } @Test diff --git a/hutool-core/src/test/java/cn/hutool/core/text/dfa/SensitiveUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/text/dfa/SensitiveUtilTest.java index ecba6ca0f..76755f32a 100755 --- a/hutool-core/src/test/java/cn/hutool/core/text/dfa/SensitiveUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/text/dfa/SensitiveUtilTest.java @@ -34,7 +34,7 @@ public class SensitiveUtilTest { @Test public void issue2126(){ - SensitiveUtil.init(ListUtil.of("赵", "赵阿", "赵阿三")); + SensitiveUtil.init(ListUtil.view("赵", "赵阿", "赵阿三")); final String result = SensitiveUtil.sensitiveFilter("赵阿三在做什么。", true, null); Assert.assertEquals("***在做什么。", result); diff --git a/hutool-core/src/test/java/cn/hutool/core/tree/Issue2279Test.java b/hutool-core/src/test/java/cn/hutool/core/tree/Issue2279Test.java index 0773b7dd9..d56cc38d3 100755 --- a/hutool-core/src/test/java/cn/hutool/core/tree/Issue2279Test.java +++ b/hutool-core/src/test/java/cn/hutool/core/tree/Issue2279Test.java @@ -1,8 +1,6 @@ package cn.hutool.core.tree; import cn.hutool.core.collection.ListUtil; -import cn.hutool.core.tree.Tree; -import cn.hutool.core.tree.TreeUtil; import lombok.Data; import org.junit.Assert; import org.junit.Test; @@ -13,7 +11,7 @@ public class Issue2279Test { @Test public void buildSingleTest() { - final List list = ListUtil.of( + final List list = ListUtil.view( // 模拟数据 new TestTree(1, 0, 1, 1), new TestTree(2, 1, 2, 2), diff --git a/hutool-core/src/test/java/cn/hutool/core/tree/TreeTest.java b/hutool-core/src/test/java/cn/hutool/core/tree/TreeTest.java index cccccbaa2..693017ad9 100755 --- a/hutool-core/src/test/java/cn/hutool/core/tree/TreeTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/tree/TreeTest.java @@ -1,10 +1,6 @@ package cn.hutool.core.tree; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.tree.Tree; -import cn.hutool.core.tree.TreeNode; -import cn.hutool.core.tree.TreeNodeConfig; -import cn.hutool.core.tree.TreeUtil; +import cn.hutool.core.collection.ListUtil; import org.junit.Assert; import org.junit.Test; @@ -18,7 +14,7 @@ import java.util.List; */ public class TreeTest { // 模拟数据 - static List> nodeList = CollUtil.newArrayList(); + static List> nodeList = ListUtil.of(); static { // 模拟数据 diff --git a/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java index a4581125d..0b4a96ff1 100755 --- a/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java @@ -1,6 +1,6 @@ package cn.hutool.core.util; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import org.junit.Assert; import org.junit.Test; @@ -323,7 +323,7 @@ public class ArrayUtilTest { @Test public void toArrayTest() { - final ArrayList list = CollUtil.newArrayList("A", "B", "C", "D"); + final ArrayList list = ListUtil.of("A", "B", "C", "D"); final String[] array = ArrayUtil.toArray(list, String.class); Assert.assertEquals("A", array[0]); Assert.assertEquals("B", array[1]); diff --git a/hutool-core/src/test/java/cn/hutool/core/util/EnumUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/EnumUtilTest.java index 9ae8e61e9..7856c736a 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/EnumUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/EnumUtilTest.java @@ -1,6 +1,6 @@ package cn.hutool.core.util; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import org.junit.Assert; import org.junit.Test; @@ -18,13 +18,13 @@ public class EnumUtilTest { @Test public void getNamesTest() { final List names = EnumUtil.getNames(TestEnum.class); - Assert.assertEquals(CollUtil.newArrayList("TEST1", "TEST2", "TEST3"), names); + Assert.assertEquals(ListUtil.of("TEST1", "TEST2", "TEST3"), names); } @Test public void getFieldValuesTest() { final List types = EnumUtil.getFieldValues(TestEnum.class, "type"); - Assert.assertEquals(CollUtil.newArrayList("type1", "type2", "type3"), types); + Assert.assertEquals(ListUtil.of("type1", "type2", "type3"), types); } @Test diff --git a/hutool-core/src/test/java/cn/hutool/core/util/IdcardUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/IdcardUtilTest.java index 25a4e812f..62aef6263 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/IdcardUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/IdcardUtilTest.java @@ -47,49 +47,49 @@ public class IdcardUtilTest { } @Test - public void getAgeByIdCardTest() { + public void getAgeTest() { final DateTime date = DateUtil.parse("2017-04-10"); - final int age = IdcardUtil.getAgeByIdCard(ID_18, date); + final int age = IdcardUtil.getAge(ID_18, date); Assert.assertEquals(age, 38); - final int age2 = IdcardUtil.getAgeByIdCard(ID_15, date); + final int age2 = IdcardUtil.getAge(ID_15, date); Assert.assertEquals(age2, 28); } @Test - public void getBirthByIdCardTest() { - final String birth = IdcardUtil.getBirthByIdCard(ID_18); + public void getBirthTest() { + final String birth = IdcardUtil.getBirth(ID_18); Assert.assertEquals(birth, "19781216"); - final String birth2 = IdcardUtil.getBirthByIdCard(ID_15); + final String birth2 = IdcardUtil.getBirth(ID_15); Assert.assertEquals(birth2, "19880730"); } @Test - public void getProvinceByIdCardTest() { - final String province = IdcardUtil.getProvinceByIdCard(ID_18); + public void getProvinceTest() { + final String province = IdcardUtil.getProvince(ID_18); Assert.assertEquals(province, "江苏"); - final String province2 = IdcardUtil.getProvinceByIdCard(ID_15); + final String province2 = IdcardUtil.getProvince(ID_15); Assert.assertEquals(province2, "内蒙古"); } @Test - public void getCityCodeByIdCardTest() { - final String codeByIdCard = IdcardUtil.getCityCodeByIdCard(ID_18); - Assert.assertEquals("3210", codeByIdCard); + public void getCityCodeTest() { + final String code = IdcardUtil.getCityCode(ID_18); + Assert.assertEquals("3210", code); } @Test - public void getDistrictCodeByIdCardTest() { - final String codeByIdCard = IdcardUtil.getDistrictCodeByIdCard(ID_18); - Assert.assertEquals("321083", codeByIdCard); + public void getDistrictCodeTest() { + final String code = IdcardUtil.getDistrictCode(ID_18); + Assert.assertEquals("321083", code); } @Test - public void getGenderByIdCardTest() { - final int gender = IdcardUtil.getGenderByIdCard(ID_18); + public void getGenderTest() { + final int gender = IdcardUtil.getGender(ID_18); Assert.assertEquals(1, gender); } diff --git a/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java index 3670c29aa..d3607ce39 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java @@ -62,6 +62,9 @@ public class NumberUtilTest { Assert.assertTrue(NumberUtil.isInteger("0256")); Assert.assertTrue(NumberUtil.isInteger("0")); Assert.assertFalse(NumberUtil.isInteger("23.4")); + Assert.assertFalse(NumberUtil.isInteger(null)); + Assert.assertFalse(NumberUtil.isInteger("")); + Assert.assertFalse(NumberUtil.isInteger(" ")); } @Test @@ -71,6 +74,9 @@ public class NumberUtilTest { Assert.assertTrue(NumberUtil.isLong("0256")); Assert.assertTrue(NumberUtil.isLong("0")); Assert.assertFalse(NumberUtil.isLong("23.4")); + Assert.assertFalse(NumberUtil.isLong(null)); + Assert.assertFalse(NumberUtil.isLong("")); + Assert.assertFalse(NumberUtil.isLong(" ")); } @Test @@ -293,6 +299,13 @@ public class NumberUtilTest { Assert.assertEquals(1482L, v2.longValue()); } + @Test + public void parseHexNumberTest() { + // 千位分隔符去掉 + final int v1 = NumberUtil.parseNumber("0xff").intValue(); + Assert.assertEquals(255, v1); + } + @Test public void parseLongTest() { long number = NumberUtil.parseLong("0xFF"); @@ -433,6 +446,25 @@ public class NumberUtilTest { Assert.assertFalse(NumberUtil.isEven(a[4])); } + @Test + public void toBigIntegerTest(){ + final Number number=1123123; + final Number number2=1123123.123; + Assert.assertNotNull(NumberUtil.toBigInteger(number)); + Assert.assertNotNull(NumberUtil.toBigInteger(number2)); + } + @Test + public void divIntegerTest(){ + final BigDecimal div = NumberUtil.div(100101300, (Number) 100); + Assert.assertEquals(1001013, div.intValue()); + } + + @Test + public void isDoubleTest(){ + Assert.assertFalse(NumberUtil.isDouble(null)); + Assert.assertFalse(NumberUtil.isDouble("")); + Assert.assertFalse(NumberUtil.isDouble(" ")); + } } diff --git a/hutool-core/src/test/java/cn/hutool/core/util/ObjectUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/ObjUtilTest.java similarity index 75% rename from hutool-core/src/test/java/cn/hutool/core/util/ObjectUtilTest.java rename to hutool-core/src/test/java/cn/hutool/core/util/ObjUtilTest.java index 469cff57b..ee8378516 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/ObjectUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/ObjUtilTest.java @@ -1,24 +1,46 @@ package cn.hutool.core.util; import cn.hutool.core.clone.CloneSupport; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; import org.junit.Assert; import org.junit.Test; +import java.math.BigDecimal; import java.time.Instant; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; -public class ObjectUtilTest { +public class ObjUtilTest { @Test - public void equalsTest(){ - final Object a = null; - final Object b = null; + public void equalsTest() { + Object a = null; + Object b = null; Assert.assertTrue(ObjUtil.equals(a, b)); + + a = new BigDecimal("1.1"); + b = new BigDecimal("1.10"); + Assert.assertTrue(ObjUtil.equals(a, b)); + + a = 127; + b = 127; + Assert.assertTrue(ObjUtil.equals(a, b)); + + a = 128; + b = 128; + Assert.assertTrue(ObjUtil.equals(a, b)); + + a = LocalDateTime.of(2022, 5, 29, 22, 11); + b = LocalDateTime.of(2022, 5, 29, 22, 11); + Assert.assertTrue(ObjUtil.equals(a, b)); + + a = 1; + b = 1.0; + Assert.assertFalse(ObjUtil.equals(a, b)); } @Test @@ -33,6 +55,9 @@ public class ObjectUtilTest { map.put("c", "c1"); length = ObjUtil.length(map); Assert.assertEquals(3, length); + + final Iterable list = ListUtil.of(1, 2, 3); + Assert.assertEquals(3, ObjUtil.length(list)); } @Test @@ -58,7 +83,7 @@ public class ObjectUtilTest { @Test public void toStringTest() { - final ArrayList strings = CollUtil.newArrayList("1", "2"); + final ArrayList strings = ListUtil.of("1", "2"); final String result = ObjUtil.toString(strings); Assert.assertEquals("[1, 2]", result); } diff --git a/hutool-core/src/test/java/cn/hutool/core/util/RandomUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/RandomUtilTest.java index b4c8ad6cd..336d7b896 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/RandomUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/RandomUtilTest.java @@ -1,6 +1,6 @@ package cn.hutool.core.util; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.lang.Console; import org.junit.Assert; import org.junit.Ignore; @@ -15,13 +15,13 @@ public class RandomUtilTest { @Test public void randomEleSetTest(){ - final Set set = RandomUtil.randomEleSet(CollUtil.newArrayList(1, 2, 3, 4, 5, 6), 2); + final Set set = RandomUtil.randomEleSet(ListUtil.of(1, 2, 3, 4, 5, 6), 2); Assert.assertEquals(set.size(), 2); } @Test public void randomElesTest(){ - final List result = RandomUtil.randomEles(CollUtil.newArrayList(1, 2, 3, 4, 5, 6), 2); + final List result = RandomUtil.randomEles(ListUtil.of(1, 2, 3, 4, 5, 6), 2); Assert.assertEquals(result.size(), 2); } diff --git a/hutool-core/src/test/java/cn/hutool/core/util/ReUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/ReUtilTest.java index 0ea0c8ee2..6c9ee3cd0 100755 --- a/hutool-core/src/test/java/cn/hutool/core/util/ReUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/ReUtilTest.java @@ -1,6 +1,6 @@ package cn.hutool.core.util; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.lang.Console; import cn.hutool.core.regex.PatternPool; import cn.hutool.core.regex.ReUtil; @@ -82,7 +82,7 @@ public class ReUtilTest { public void findAllTest() { // 查找所有匹配文本 final List resultFindAll = ReUtil.findAll("\\w{2}", content, 0, new ArrayList<>()); - final ArrayList expected = CollUtil.newArrayList("ZZ", "Za", "aa", "bb", "bc", "cc", "12", "34"); + final ArrayList expected = ListUtil.of("ZZ", "Za", "aa", "bb", "bc", "cc", "12", "34"); Assert.assertEquals(expected, resultFindAll); } diff --git a/hutool-core/src/test/java/cn/hutool/core/util/XmlUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/XmlUtilTest.java index b9c6eb0fe..11b1c5f3e 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/XmlUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/XmlUtilTest.java @@ -1,7 +1,8 @@ package cn.hutool.core.util; import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.collection.SetUtil; import cn.hutool.core.io.resource.ResourceUtil; import cn.hutool.core.lang.Console; import cn.hutool.core.map.MapBuilder; @@ -109,7 +110,7 @@ public class XmlUtilTest { final Map map = XmlUtil.xmlToMap(xml); Assert.assertEquals(1, map.size()); - Assert.assertEquals(CollUtil.newArrayList("张三", "李四"), map.get("name")); + Assert.assertEquals(ListUtil.of("张三", "李四"), map.get("name")); } @Test @@ -137,7 +138,7 @@ public class XmlUtilTest { public void mapToXmlTest2() { // 测试List final Map map = MapBuilder.create(new LinkedHashMap()) - .put("Town", CollUtil.newArrayList("town1", "town2")) + .put("Town", ListUtil.of("town1", "town2")) .build(); final Document doc = XmlUtil.mapToXml(map, "City"); @@ -157,7 +158,7 @@ public class XmlUtilTest { @Test public void readBySaxTest(){ - final Set eles = CollUtil.newHashSet( + final Set eles = SetUtil.of( "returnsms", "returnstatus", "message", "remainpoint", "taskID", "successCounts"); XmlUtil.readBySax(ResourceUtil.getStream("test.xml"), new DefaultHandler(){ @Override diff --git a/hutool-core/src/test/resources/test-compile/a/A.java b/hutool-core/src/test/resources/test-compile/a/A.java index f87d54642..9eeaef931 100755 --- a/hutool-core/src/test/resources/test-compile/a/A.java +++ b/hutool-core/src/test/resources/test-compile/a/A.java @@ -1,5 +1,6 @@ package a; +import cn.hutool.core.lang.Console; import cn.hutool.core.lang.ConsoleTable; import cn.hutool.core.lang.caller.CallerUtil; @@ -10,15 +11,12 @@ public class A { public A() { new InnerClass() {{ int i = 0; - Class caller = CallerUtil.getCaller(i); - final ConsoleTable t = new ConsoleTable(); - t.addHeader("类名", "类加载器"); - System.out.println("初始化 " + getClass() + " 的调用链为: "); - while (caller != null) { - t.addBody(caller.toString(), caller.getClassLoader().toString()); + Console.log("初始化 " + getClass() + " 的调用链为: "); + Class caller = CallerUtil.getCaller(i); + while (caller != null) { + Console.log("{} {}", caller, caller.getClassLoader()); caller = CallerUtil.getCaller(++i); } - t.print(); }}; } } diff --git a/hutool-db/pom.xml b/hutool-db/pom.xml index 81665ee0b..6af26d214 100755 --- a/hutool-db/pom.xml +++ b/hutool-db/pom.xml @@ -22,12 +22,10 @@ 2.9.0 10.0.20 1.2.9 - 2.4.13 - 4.6.0 + 4.0.3 3.36.0.3 2.5.2 - 4.2.2 @@ -62,7 +60,7 @@ com.zaxxer - HikariCP-java7 + HikariCP ${hikariCP.version} @@ -81,7 +79,7 @@ com.github.chris2018998 beecp - 3.3.5 + 3.3.6 slf4j-api @@ -94,31 +92,6 @@ org.apache.commons commons-dbcp2 ${dbcp2.version} - - - commons-pool2 - org.apache.commons - - - true - - - org.mongodb - mongodb-driver-sync - ${mongo4.version} - true - - - - redis.clients - jedis - ${jedis.version} - - - slf4j-api - org.slf4j - - true @@ -156,7 +129,7 @@ com.microsoft.sqlserver mssql-jdbc - 10.2.0.jre8 + 10.2.1.jre8 test diff --git a/hutool-db/src/main/java/cn/hutool/db/AbstractDb.java b/hutool-db/src/main/java/cn/hutool/db/AbstractDb.java index 72f83bcb3..710d3d476 100755 --- a/hutool-db/src/main/java/cn/hutool/db/AbstractDb.java +++ b/hutool-db/src/main/java/cn/hutool/db/AbstractDb.java @@ -1,6 +1,6 @@ package cn.hutool.db; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.lang.func.Func1; import cn.hutool.db.dialect.Dialect; import cn.hutool.db.handler.BeanListHandler; @@ -417,7 +417,7 @@ public abstract class AbstractDb> extends DefaultConnect * @throws DbRuntimeException SQL执行异常 */ public int del(final String tableName, final String field, final Object value) throws DbRuntimeException { - return del(Entity.create(tableName).set(field, value)); + return del(Entity.of(tableName).set(field, value)); } /** @@ -470,7 +470,7 @@ public abstract class AbstractDb> extends DefaultConnect * @throws DbRuntimeException SQL执行异常 */ public Entity get(final String tableName, final String field, final T value) throws DbRuntimeException { - return this.get(Entity.create(tableName).set(field, value)); + return this.get(Entity.of(tableName).set(field, value)); } /** @@ -554,7 +554,7 @@ public abstract class AbstractDb> extends DefaultConnect * @throws DbRuntimeException SQL执行异常 */ public T find(final Entity where, final RsHandler rsh, final String... fields) throws DbRuntimeException { - return find(CollUtil.newArrayList(fields), where, rsh); + return find(ListUtil.of(fields), where, rsh); } /** @@ -620,7 +620,7 @@ public abstract class AbstractDb> extends DefaultConnect * @throws DbRuntimeException SQL执行异常 */ public List findAll(final String tableName) throws DbRuntimeException { - return findAll(Entity.create(tableName)); + return findAll(Entity.of(tableName)); } /** @@ -633,7 +633,7 @@ public abstract class AbstractDb> extends DefaultConnect * @throws DbRuntimeException SQL执行异常 */ public List findBy(final String tableName, final String field, final Object value) throws DbRuntimeException { - return findAll(Entity.create(tableName).set(field, value)); + return findAll(Entity.of(tableName).set(field, value)); } /** @@ -661,7 +661,7 @@ public abstract class AbstractDb> extends DefaultConnect * @throws DbRuntimeException SQL执行异常 */ public List findLike(final String tableName, final String field, final String value, final LikeType likeType) throws DbRuntimeException { - return findAll(Entity.create(tableName).set(field, SqlUtil.buildLikeValue(value, likeType, true))); + return findAll(Entity.of(tableName).set(field, SqlUtil.buildLikeValue(value, likeType, true))); } /** diff --git a/hutool-db/src/main/java/cn/hutool/db/ActiveEntity.java b/hutool-db/src/main/java/cn/hutool/db/ActiveEntity.java index 7d73e44f0..32edd3f49 100755 --- a/hutool-db/src/main/java/cn/hutool/db/ActiveEntity.java +++ b/hutool-db/src/main/java/cn/hutool/db/ActiveEntity.java @@ -219,7 +219,7 @@ public class ActiveEntity extends Entity { * @return this */ public ActiveEntity update(final String primaryKey) { - db.update(this, Entity.create().set(primaryKey, this.get(primaryKey))); + db.update(this, Entity.of().set(primaryKey, this.get(primaryKey))); return this; } // -------------------------------------------------------------------------- CRUD end diff --git a/hutool-db/src/main/java/cn/hutool/db/DaoTemplate.java b/hutool-db/src/main/java/cn/hutool/db/DaoTemplate.java index 0cfc7d4ae..13ee3306b 100644 --- a/hutool-db/src/main/java/cn/hutool/db/DaoTemplate.java +++ b/hutool-db/src/main/java/cn/hutool/db/DaoTemplate.java @@ -139,7 +139,7 @@ public class DaoTemplate { if (pk == null) { return 0; } - return this.del(Entity.create(tableName).set(primaryKeyField, pk)); + return this.del(Entity.of(tableName).set(primaryKeyField, pk)); } /** @@ -156,7 +156,7 @@ public class DaoTemplate { return 0; } - return this.del(Entity.create(tableName).set(field, value)); + return this.del(Entity.of(tableName).set(field, value)); } /** @@ -208,7 +208,7 @@ public class DaoTemplate { throw new DbRuntimeException(StrUtil.format("Please determine `{}` for update", primaryKeyField)); } - final Entity where = Entity.create(tableName).set(primaryKeyField, pk); + final Entity where = Entity.of(tableName).set(primaryKeyField, pk); final Entity record = entity.clone(); record.remove(primaryKeyField); @@ -252,7 +252,7 @@ public class DaoTemplate { * @throws DbRuntimeException SQL执行异常 */ public Entity get(final String field, final T value) throws DbRuntimeException { - return this.get(Entity.create(tableName).set(field, value)); + return this.get(Entity.of(tableName).set(field, value)); } /** @@ -279,7 +279,7 @@ public class DaoTemplate { * @throws DbRuntimeException SQL执行异常 */ public List find(final String field, final T value) throws DbRuntimeException { - return this.find(Entity.create(tableName).set(field, value)); + return this.find(Entity.of(tableName).set(field, value)); } /** @@ -289,7 +289,7 @@ public class DaoTemplate { * @throws DbRuntimeException SQL执行异常 */ public List findAll() throws DbRuntimeException { - return this.find(Entity.create(tableName)); + return this.find(Entity.of(tableName)); } /** @@ -377,7 +377,7 @@ public class DaoTemplate { */ private Entity fixEntity(Entity entity) { if (null == entity) { - entity = Entity.create(tableName); + entity = Entity.of(tableName); } else if (StrUtil.isBlank(entity.getTableName())) { entity.setTableName(tableName); } diff --git a/hutool-db/src/main/java/cn/hutool/db/Entity.java b/hutool-db/src/main/java/cn/hutool/db/Entity.java index 5f39e70cc..32fe7a3e3 100755 --- a/hutool-db/src/main/java/cn/hutool/db/Entity.java +++ b/hutool-db/src/main/java/cn/hutool/db/Entity.java @@ -1,6 +1,7 @@ package cn.hutool.db; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.SetUtil; import cn.hutool.core.lang.func.Func0; import cn.hutool.core.map.Dict; import cn.hutool.core.reflect.MethodUtil; @@ -38,7 +39,7 @@ public class Entity extends Dict { * * @return Entity */ - public static Entity create() { + public static Entity of() { return new Entity(); } @@ -48,7 +49,7 @@ public class Entity extends Dict { * @param tableName 表名 * @return Entity */ - public static Entity create(final String tableName) { + public static Entity of(final String tableName) { return new Entity(tableName); } @@ -60,7 +61,7 @@ public class Entity extends Dict { * @return Entity */ public static Entity parse(final T bean) { - return create(null).parseBean(bean); + return of(null).parseBean(bean); } /** @@ -73,7 +74,7 @@ public class Entity extends Dict { * @return Entity */ public static Entity parse(final T bean, final boolean isToUnderlineCase, final boolean ignoreNullValue) { - return create(null).parseBean(bean, isToUnderlineCase, ignoreNullValue); + return of(null).parseBean(bean, isToUnderlineCase, ignoreNullValue); } /** @@ -84,7 +85,7 @@ public class Entity extends Dict { * @return Entity */ public static Entity parseWithUnderlineCase(final T bean) { - return create(null).parseBean(bean, true, true); + return of(null).parseBean(bean, true, true); } // --------------------------------------------------------------- Static method end @@ -155,7 +156,7 @@ public class Entity extends Dict { */ public Entity setFieldNames(final Collection fieldNames) { if (CollUtil.isNotEmpty(fieldNames)) { - this.fieldNames = CollUtil.newHashSet(true, fieldNames); + this.fieldNames = SetUtil.of(true, fieldNames); } return this; } @@ -168,7 +169,7 @@ public class Entity extends Dict { */ public Entity setFieldNames(final String... fieldNames) { if (ArrayUtil.isNotEmpty(fieldNames)) { - this.fieldNames = CollUtil.newLinkedHashSet(fieldNames); + this.fieldNames = SetUtil.ofLinked(fieldNames); } return this; } diff --git a/hutool-db/src/main/java/cn/hutool/db/dialect/Dialect.java b/hutool-db/src/main/java/cn/hutool/db/dialect/Dialect.java index 921d3ad4d..c9a8f1172 100644 --- a/hutool-db/src/main/java/cn/hutool/db/dialect/Dialect.java +++ b/hutool-db/src/main/java/cn/hutool/db/dialect/Dialect.java @@ -1,6 +1,5 @@ package cn.hutool.db.dialect; -import cn.hutool.core.collection.ListUtil; import cn.hutool.db.Entity; import cn.hutool.db.Page; import cn.hutool.db.sql.Order; @@ -134,7 +133,7 @@ public interface Dialect extends Serializable { * @throws SQLException SQL执行异常 */ default PreparedStatement psForCount(final Connection conn, final Query query) throws SQLException { - return psForFind(conn, query.clone().setFields(ListUtil.toList("count(1)"))); + return psForCount(conn, SqlBuilder.create().query(query)); } /** diff --git a/hutool-db/src/main/java/cn/hutool/db/dialect/DialectName.java b/hutool-db/src/main/java/cn/hutool/db/dialect/DialectName.java index 71f84d83a..0d151dd53 100644 --- a/hutool-db/src/main/java/cn/hutool/db/dialect/DialectName.java +++ b/hutool-db/src/main/java/cn/hutool/db/dialect/DialectName.java @@ -9,7 +9,7 @@ import cn.hutool.core.text.StrUtil; * @author Looly */ public enum DialectName { - ANSI, MYSQL, ORACLE, POSTGREESQL, SQLITE3, H2, SQLSERVER, SQLSERVER2012, PHOENIX; + ANSI, MYSQL, ORACLE, POSTGRESQL, SQLITE3, H2, SQLSERVER, SQLSERVER2012, PHOENIX; /** * 是否为指定数据库方言,检查时不分区大小写 diff --git a/hutool-db/src/main/java/cn/hutool/db/dialect/impl/PostgresqlDialect.java b/hutool-db/src/main/java/cn/hutool/db/dialect/impl/PostgresqlDialect.java index 23106dbaa..f9e43fb19 100644 --- a/hutool-db/src/main/java/cn/hutool/db/dialect/impl/PostgresqlDialect.java +++ b/hutool-db/src/main/java/cn/hutool/db/dialect/impl/PostgresqlDialect.java @@ -28,7 +28,7 @@ public class PostgresqlDialect extends AnsiSqlDialect{ @Override public String dialectName() { - return DialectName.POSTGREESQL.name(); + return DialectName.POSTGRESQL.name(); } @Override diff --git a/hutool-db/src/main/java/cn/hutool/db/meta/Column.java b/hutool-db/src/main/java/cn/hutool/db/meta/Column.java index 969c45e67..c57673c12 100755 --- a/hutool-db/src/main/java/cn/hutool/db/meta/Column.java +++ b/hutool-db/src/main/java/cn/hutool/db/meta/Column.java @@ -37,7 +37,7 @@ public class Column implements Serializable, Cloneable { /** * 大小或数据长度 */ - private int size; + private long size; private Integer digit; /** * 是否为可空 @@ -118,7 +118,7 @@ public class Column implements Serializable, Cloneable { typeName = ReUtil.delLast("\\(\\d+\\)", typeName); this.typeName = typeName; - this.size = columnMetaRs.getInt("COLUMN_SIZE"); + this.size = columnMetaRs.getLong("COLUMN_SIZE"); this.isNullable = columnMetaRs.getBoolean("NULLABLE"); this.comment = columnMetaRs.getString("REMARKS"); this.columnDef = columnMetaRs.getString("COLUMN_DEF"); @@ -238,7 +238,7 @@ public class Column implements Serializable, Cloneable { * * @return 大小或数据长度 */ - public int getSize() { + public long getSize() { return size; } @@ -248,7 +248,7 @@ public class Column implements Serializable, Cloneable { * @param size 大小或数据长度 * @return this */ - public Column setSize(final int size) { + public Column setSize(final long size) { this.size = size; return this; } diff --git a/hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java b/hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java index 05729e423..13200ed0c 100755 --- a/hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java +++ b/hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java @@ -172,7 +172,7 @@ public class MetaUtil { */ public static Entity createLimitedEntity(final DataSource ds, final String tableName) { final String[] columnNames = getColumnNames(ds, tableName); - return Entity.create(tableName).setFieldNames(columnNames); + return Entity.of(tableName).setFieldNames(columnNames); } /** @@ -272,7 +272,7 @@ public class MetaUtil { indexInfo.getColumnIndexInfoList().add(ColumnIndexInfo.create(rs)); } } - table.setIndexInfoList(ListUtil.toList(indexInfoMap.values())); + table.setIndexInfoList(ListUtil.of(indexInfoMap.values())); } } catch (final SQLException e) { throw new DbRuntimeException("Get columns error!", e); diff --git a/hutool-db/src/main/java/cn/hutool/db/meta/ResultColumn.java b/hutool-db/src/main/java/cn/hutool/db/meta/ResultColumn.java new file mode 100644 index 000000000..6187ea5ef --- /dev/null +++ b/hutool-db/src/main/java/cn/hutool/db/meta/ResultColumn.java @@ -0,0 +1,176 @@ +package cn.hutool.db.meta; + +import cn.hutool.db.DbRuntimeException; + +import java.sql.ResultSetMetaData; +import java.sql.SQLException; + +/** + * {@link ResultSetMetaData}中某一列的元数据信息 + * + * @author looly + */ +public class ResultColumn { + + private final boolean autoIncrement; + private final boolean caseSensitive; + private final boolean searchable; + private final boolean currency; + private final int nullable; + private final boolean signed; + private final int displaySize; + private final String label; + private final String name; + private final String schemaName; + private final int precision; + private final int scale; + private final String tableName; + private final String catalogName; + private final int type; + private final String typeName; + private final boolean readOnly; + private final boolean writable; + private final boolean definitelyWritable; + private final String className; + + /** + * 构造 + * + * @param metaData {@link ResultSetMetaData} + * @param columnIndexBase1 列序号,从1开始。即第一列为1,第二列为2。。。 + * @throws DbRuntimeException SQLException包装 + */ + public ResultColumn(final ResultSetMetaData metaData, final int columnIndexBase1) throws DbRuntimeException { + try { + this.autoIncrement = metaData.isAutoIncrement(columnIndexBase1); + this.caseSensitive = metaData.isCaseSensitive(columnIndexBase1); + this.searchable = metaData.isSearchable(columnIndexBase1); + this.currency = metaData.isCurrency(columnIndexBase1); + this.nullable = metaData.isNullable(columnIndexBase1); + this.signed = metaData.isSigned(columnIndexBase1); + this.displaySize = metaData.getColumnDisplaySize(columnIndexBase1); + this.label = metaData.getColumnLabel(columnIndexBase1); + this.name = metaData.getColumnName(columnIndexBase1); + this.schemaName = metaData.getSchemaName(columnIndexBase1); + this.precision = metaData.getPrecision(columnIndexBase1); + this.scale = metaData.getScale(columnIndexBase1); + this.tableName = metaData.getTableName(columnIndexBase1); + this.catalogName = metaData.getCatalogName(columnIndexBase1); + this.type = metaData.getColumnType(columnIndexBase1); + this.typeName = metaData.getColumnTypeName(columnIndexBase1); + this.readOnly = metaData.isReadOnly(columnIndexBase1); + this.writable = metaData.isWritable(columnIndexBase1); + this.definitelyWritable = metaData.isDefinitelyWritable(columnIndexBase1); + this.className = metaData.getColumnClassName(columnIndexBase1); + } catch (final SQLException e) { + throw new DbRuntimeException(e); + } + } + + public boolean isAutoIncrement() { + return autoIncrement; + } + + public boolean isCaseSensitive() { + return caseSensitive; + } + + public boolean isSearchable() { + return searchable; + } + + public boolean isCurrency() { + return currency; + } + + public int getNullable() { + return nullable; + } + + public ColumnNullable getNullableEnum() { + return ColumnNullable.of(getNullable()); + } + + public boolean isSigned() { + return signed; + } + + public int getDisplaySize() { + return displaySize; + } + + public String getLabel() { + return label; + } + + public String getName() { + return name; + } + + public String getSchemaName() { + return schemaName; + } + + public int getPrecision() { + return precision; + } + + public int getScale() { + return scale; + } + + public String getTableName() { + return tableName; + } + + public String getCatalogName() { + return catalogName; + } + + public int getType() { + return type; + } + + public String getTypeName() { + return typeName; + } + + public boolean isReadOnly() { + return readOnly; + } + + public boolean isWritable() { + return writable; + } + + public boolean isDefinitelyWritable() { + return definitelyWritable; + } + + public String getClassName() { + return className; + } + + public static enum ColumnNullable { + NO_NULLS(ResultSetMetaData.columnNoNulls), + NULLABLE(ResultSetMetaData.columnNullable), + UNKNOWN(ResultSetMetaData.columnNullableUnknown); + + final int value; + + private ColumnNullable(final int value) { + this.value = value; + } + + public static ColumnNullable of(final int nullable) { + switch (nullable) { + case ResultSetMetaData.columnNoNulls: + return NO_NULLS; + case ResultSetMetaData.columnNullable: + return NULLABLE; + default: + return UNKNOWN; + } + } + } +} diff --git a/hutool-db/src/main/java/cn/hutool/db/nosql/mongo/MongoDS.java b/hutool-db/src/main/java/cn/hutool/db/nosql/mongo/MongoDS.java deleted file mode 100644 index ac815534a..000000000 --- a/hutool-db/src/main/java/cn/hutool/db/nosql/mongo/MongoDS.java +++ /dev/null @@ -1,397 +0,0 @@ -package cn.hutool.db.nosql.mongo; - -import cn.hutool.core.exceptions.NotInitedException; -import cn.hutool.core.net.NetUtil; -import cn.hutool.core.text.StrUtil; -import cn.hutool.db.DbRuntimeException; -import cn.hutool.log.Log; -import cn.hutool.setting.Setting; -import com.mongodb.MongoClientSettings; -import com.mongodb.MongoCredential; -import com.mongodb.ServerAddress; -import com.mongodb.client.MongoClient; -import com.mongodb.client.MongoClients; -import com.mongodb.client.MongoCollection; -import com.mongodb.client.MongoDatabase; -import com.mongodb.connection.ConnectionPoolSettings; -import com.mongodb.connection.SocketSettings; -import org.bson.Document; - -import java.io.Closeable; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.TimeUnit; - -/** - * MongoDB4工具类 - * - * @author VampireAchao - */ -public class MongoDS implements Closeable { - - private final static Log log = Log.get(); - - /** - * 默认配置文件 - */ - public final static String MONGO_CONFIG_PATH = "config/mongo.setting"; - - // MongoDB配置文件 - private Setting setting; - // MongoDB实例连接列表 - private String[] groups; - // MongoDB单点连接信息 - private ServerAddress serverAddress; - // MongoDB客户端对象 - private MongoClient mongo; - - // --------------------------------------------------------------------------- Constructor start - - /** - * 构造MongoDB数据源
    - * 调用者必须持有MongoDS实例,否则会被垃圾回收导致写入失败! - * - * @param host 主机(域名或者IP) - * @param port 端口 - */ - public MongoDS(final String host, final int port) { - this.serverAddress = createServerAddress(host, port); - initSingle(); - } - - /** - * 构造MongoDB数据源
    - * 调用者必须持有MongoDS实例,否则会被垃圾回收导致写入失败! - * - * @param mongoSetting MongoDB的配置文件,如果是null则读取默认配置文件或者使用MongoDB默认客户端配置 - * @param host 主机(域名或者IP) - * @param port 端口 - */ - public MongoDS(final Setting mongoSetting, final String host, final int port) { - this.setting = mongoSetting; - this.serverAddress = createServerAddress(host, port); - initSingle(); - } - - /** - * 构造MongoDB数据源
    - * 当提供多个数据源时,这些数据源将为一个副本集或者多个mongos
    - * 调用者必须持有MongoDS实例,否则会被垃圾回收导致写入失败! 官方文档: http://docs.mongodb.org/manual/administration/replica-sets/ - * - * @param groups 分组列表,当为null或空时使用无分组配置,一个分组使用单一模式,否则使用副本集模式 - */ - public MongoDS(final String... groups) { - this.groups = groups; - init(); - } - - /** - * 构造MongoDB数据源
    - * 当提供多个数据源时,这些数据源将为一个副本集或者mongos
    - * 调用者必须持有MongoDS实例,否则会被垃圾回收导致写入失败!
    - * 官方文档: http://docs.mongodb.org/manual/administration/replica-sets/ - * - * @param mongoSetting MongoDB的配置文件,必须有 - * @param groups 分组列表,当为null或空时使用无分组配置,一个分组使用单一模式,否则使用副本集模式 - */ - public MongoDS(final Setting mongoSetting, final String... groups) { - if (mongoSetting == null) { - throw new DbRuntimeException("Mongo setting is null!"); - } - this.setting = mongoSetting; - this.groups = groups; - init(); - } - // --------------------------------------------------------------------------- Constructor end - - /** - * 初始化,当给定分组数大于一个时使用 - */ - public void init() { - if (groups != null && groups.length > 1) { - initCloud(); - } else { - initSingle(); - } - } - - /** - * 初始化
    - * 设定文件中的host和端口有三种形式: - * - *
    -	 * host = host:port
    -	 * 
    - * - *
    -	 * host = host
    -	 * port = port
    -	 * 
    - * - *
    -	 * host = host
    -	 * 
    - */ - synchronized public void initSingle() { - if (setting == null) { - try { - setting = new Setting(MONGO_CONFIG_PATH, true); - } catch (final Exception e) { - // 在single模式下,可以没有配置文件。 - } - } - - String group = StrUtil.EMPTY; - if (null == this.serverAddress) { - //存在唯一分组 - if (groups != null && groups.length == 1) { - group = groups[0]; - } - serverAddress = createServerAddress(group); - } - - final MongoCredential credentail = createCredentail(group); - try { - final MongoClientSettings.Builder clusterSettingsBuilder = MongoClientSettings.builder() - .applyToClusterSettings(b -> b.hosts(Collections.singletonList(serverAddress))); - buildMongoClientSettings(clusterSettingsBuilder, group); - if (null != credentail) { - clusterSettingsBuilder.credential(credentail); - } - mongo = MongoClients.create(clusterSettingsBuilder.build()); - } catch (final Exception e) { - throw new DbRuntimeException(StrUtil.format("Init MongoDB pool with connection to [{}] error!", serverAddress), e); - } - - log.info("Init MongoDB pool with connection to [{}]", serverAddress); - } - - /** - * 初始化集群
    - * 集群的其它客户端设定参数使用全局设定
    - * 集群中每一个实例成员用一个group表示,例如: - * - *
    -	 * user = test1
    -	 * pass = 123456
    -	 * database = test
    -	 * [db0]
    -	 * host = 192.168.1.1:27117
    -	 * [db1]
    -	 * host = 192.168.1.1:27118
    -	 * [db2]
    -	 * host = 192.168.1.1:27119
    -	 * 
    - */ - synchronized public void initCloud() { - if (groups == null || groups.length == 0) { - throw new DbRuntimeException("Please give replication set groups!"); - } - - if (setting == null) { - // 若未指定配置文件,则使用默认配置文件 - setting = new Setting(MONGO_CONFIG_PATH, true); - } - - final List addrList = new ArrayList<>(); - for (final String group : groups) { - addrList.add(createServerAddress(group)); - } - - final MongoCredential credentail = createCredentail(StrUtil.EMPTY); - try { - final MongoClientSettings.Builder clusterSettingsBuilder = MongoClientSettings.builder() - .applyToClusterSettings(b -> b.hosts(addrList)); - buildMongoClientSettings(clusterSettingsBuilder, StrUtil.EMPTY); - if (null != credentail) { - clusterSettingsBuilder.credential(credentail); - } - mongo = MongoClients.create(clusterSettingsBuilder.build()); - } catch (final Exception e) { - log.error(e, "Init MongoDB connection error!"); - return; - } - - log.info("Init MongoDB cloud Set pool with connection to {}", addrList); - } - - /** - * 设定MongoDB配置文件 - * - * @param setting 配置文件 - */ - public void setSetting(final Setting setting) { - this.setting = setting; - } - - /** - * @return 获得MongoDB客户端对象 - */ - public MongoClient getMongo() { - return mongo; - } - - /** - * 获得DB - * - * @param dbName DB - * @return DB - */ - public MongoDatabase getDb(final String dbName) { - return mongo.getDatabase(dbName); - } - - /** - * 获得MongoDB中指定集合对象 - * - * @param dbName 库名 - * @param collectionName 集合名 - * @return DBCollection - */ - public MongoCollection getCollection(final String dbName, final String collectionName) { - return getDb(dbName).getCollection(collectionName); - } - - @Override - public void close() { - mongo.close(); - } - - // --------------------------------------------------------------------------- Private method start - - /** - * 创建ServerAddress对象,会读取配置文件中的相关信息 - * - * @param group 分组,如果为{@code null}或者""默认为无分组 - * @return ServerAddress - */ - private ServerAddress createServerAddress(String group) { - final Setting setting = checkSetting(); - - if (group == null) { - group = StrUtil.EMPTY; - } - - final String tmpHost = setting.getByGroup("host", group); - if (StrUtil.isBlank(tmpHost)) { - throw new NotInitedException("Host name is empy of group: {}", group); - } - - final int defaultPort = setting.getInt("port", group, 27017); - return new ServerAddress(NetUtil.buildInetSocketAddress(tmpHost, defaultPort)); - } - - /** - * 创建ServerAddress对象 - * - * @param host 主机域名或者IP(如果为空默认127.0.0.1) - * @param port 端口(如果为空默认为) - * @return ServerAddress - */ - private ServerAddress createServerAddress(final String host, final int port) { - return new ServerAddress(host, port); - } - - /** - * 创建{@link MongoCredential},用于服务端验证
    - * 此方法会首先读取指定分组下的属性,用户没有定义则读取空分组下的属性 - * - * @param group 分组 - * @return {@link MongoCredential},如果用户未指定用户名密码返回null - * @since 4.1.20 - */ - private MongoCredential createCredentail(final String group) { - final Setting setting = this.setting; - if (null == setting) { - return null; - } - final String user = setting.getStr("user", group, setting.getStr("user")); - final String pass = setting.getStr("pass", group, setting.getStr("pass")); - final String database = setting.getStr("database", group, setting.getStr("database")); - return createCredentail(user, database, pass); - } - - /** - * 创建{@link MongoCredential},用于服务端验证 - * - * @param userName 用户名 - * @param database 数据库名 - * @param password 密码 - * @return {@link MongoCredential} - * @since 4.1.20 - */ - private MongoCredential createCredentail(final String userName, final String database, final String password) { - if (StrUtil.hasEmpty(userName, database, database)) { - return null; - } - return MongoCredential.createCredential(userName, database, password.toCharArray()); - } - - /** - * 构件MongoDB连接选项
    - * - * @param group 分组,当分组对应的选项不存在时会读取根选项,如果也不存在使用默认值 - * @return Builder - */ - private MongoClientSettings.Builder buildMongoClientSettings(final MongoClientSettings.Builder builder, String group) { - if (setting == null) { - return builder; - } - - if (StrUtil.isEmpty(group)) { - group = StrUtil.EMPTY; - } else { - group = group + StrUtil.DOT; - } - - // 每个主机答应的连接数(每个主机的连接池大小),当连接池被用光时,会被阻塞住 - Integer connectionsPerHost = setting.getInt(group + "connectionsPerHost"); - if (StrUtil.isBlank(group) == false && connectionsPerHost == null) { - connectionsPerHost = setting.getInt("connectionsPerHost"); - } - final ConnectionPoolSettings.Builder connectionPoolSettingsBuilder = ConnectionPoolSettings.builder(); - if (connectionsPerHost != null) { - connectionPoolSettingsBuilder.maxSize(connectionsPerHost); - log.debug("MongoDB connectionsPerHost: {}", connectionsPerHost); - } - - // 被阻塞线程从连接池获取连接的最长等待时间(ms) --int - final Integer connectTimeout = setting.getInt(group + "connectTimeout"); - if (StrUtil.isBlank(group) == false && connectTimeout == null) { - setting.getInt("connectTimeout"); - } - if (connectTimeout != null) { - connectionPoolSettingsBuilder.maxWaitTime(connectTimeout, TimeUnit.MILLISECONDS); - log.debug("MongoDB connectTimeout: {}", connectTimeout); - } - builder.applyToConnectionPoolSettings(b -> b.applySettings(connectionPoolSettingsBuilder.build())); - - // 套接字超时时间;该值会被传递给Socket.setSoTimeout(int)。默以为0(无穷) --int - final Integer socketTimeout = setting.getInt(group + "socketTimeout"); - if (StrUtil.isBlank(group) == false && socketTimeout == null) { - setting.getInt("socketTimeout"); - } - if (socketTimeout != null) { - final SocketSettings socketSettings = SocketSettings.builder().connectTimeout(socketTimeout, TimeUnit.MILLISECONDS).build(); - builder.applyToSocketSettings(b -> b.applySettings(socketSettings)); - log.debug("MongoDB socketTimeout: {}", socketTimeout); - } - - return builder; - } - - /** - * 检查Setting配置文件 - * - * @return Setting配置文件 - */ - private Setting checkSetting() { - if (null == this.setting) { - throw new DbRuntimeException("Please indicate setting file or create default [{}]", MONGO_CONFIG_PATH); - } - return this.setting; - } - // --------------------------------------------------------------------------- Private method end - -} diff --git a/hutool-db/src/main/java/cn/hutool/db/nosql/mongo/MongoFactory.java b/hutool-db/src/main/java/cn/hutool/db/nosql/mongo/MongoFactory.java deleted file mode 100644 index 2201401da..000000000 --- a/hutool-db/src/main/java/cn/hutool/db/nosql/mongo/MongoFactory.java +++ /dev/null @@ -1,126 +0,0 @@ -package cn.hutool.db.nosql.mongo; - -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.RuntimeUtil; -import cn.hutool.setting.Setting; - -import java.util.Collection; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * {@link MongoDS}工厂类,用于创建 - * - * @author Looly, VampireAchao - */ -public class MongoFactory { - - /** - * 各分组做组合key的时候分隔符 - */ - private final static String GROUP_SEPRATER = ","; - - /** - * 数据源池 - */ - private static final Map DS_MAP = new ConcurrentHashMap<>(); - - // JVM关闭前关闭MongoDB连接 - static { - RuntimeUtil.addShutdownHook(MongoFactory::closeAll); - } - - // ------------------------------------------------------------------------ Get DS start - - /** - * 获取MongoDB数据源
    - * - * @param host 主机 - * @param port 端口 - * @return MongoDB连接 - */ - public static MongoDS getDS(final String host, final int port) { - final String key = host + ":" + port; - MongoDS ds = DS_MAP.get(key); - if (null == ds) { - // 没有在池中加入之 - ds = new MongoDS(host, port); - DS_MAP.put(key, ds); - } - - return ds; - } - - /** - * 获取MongoDB数据源
    - * 多个分组名对应的连接组成集群 - * - * @param groups 分组列表 - * @return MongoDB连接 - */ - public static MongoDS getDS(final String... groups) { - final String key = ArrayUtil.join(groups, GROUP_SEPRATER); - MongoDS ds = DS_MAP.get(key); - if (null == ds) { - // 没有在池中加入之 - ds = new MongoDS(groups); - DS_MAP.put(key, ds); - } - - return ds; - } - - /** - * 获取MongoDB数据源
    - * - * @param groups 分组列表 - * @return MongoDB连接 - */ - public static MongoDS getDS(final Collection groups) { - return getDS(groups.toArray(new String[0])); - } - - /** - * 获取MongoDB数据源
    - * - * @param setting 设定文件 - * @param groups 分组列表 - * @return MongoDB连接 - */ - public static MongoDS getDS(final Setting setting, final String... groups) { - final String key = setting.getSettingPath() + GROUP_SEPRATER + ArrayUtil.join(groups, GROUP_SEPRATER); - MongoDS ds = DS_MAP.get(key); - if (null == ds) { - // 没有在池中加入之 - ds = new MongoDS(setting, groups); - DS_MAP.put(key, ds); - } - - return ds; - } - - /** - * 获取MongoDB数据源
    - * - * @param setting 配置文件 - * @param groups 分组列表 - * @return MongoDB连接 - */ - public static MongoDS getDS(final Setting setting, final Collection groups) { - return getDS(setting, groups.toArray(new String[0])); - } - // ------------------------------------------------------------------------ Get DS ends - - /** - * 关闭全部连接 - */ - public static void closeAll() { - if (MapUtil.isNotEmpty(DS_MAP)) { - for (final MongoDS ds : DS_MAP.values()) { - ds.close(); - } - DS_MAP.clear(); - } - } -} diff --git a/hutool-db/src/main/java/cn/hutool/db/nosql/mongo/package-info.java b/hutool-db/src/main/java/cn/hutool/db/nosql/mongo/package-info.java deleted file mode 100644 index d755d1443..000000000 --- a/hutool-db/src/main/java/cn/hutool/db/nosql/mongo/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * MongoDB数据库操作的封装 - * - * @author looly - * - */ -package cn.hutool.db.nosql.mongo; \ No newline at end of file diff --git a/hutool-db/src/main/java/cn/hutool/db/nosql/package-info.java b/hutool-db/src/main/java/cn/hutool/db/nosql/package-info.java deleted file mode 100644 index 31a272fb6..000000000 --- a/hutool-db/src/main/java/cn/hutool/db/nosql/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * NoSQL封装,包括Redis和MongoDB等数据库操作的封装 - * - * @author looly - * - */ -package cn.hutool.db.nosql; \ No newline at end of file diff --git a/hutool-db/src/main/java/cn/hutool/db/nosql/redis/RedisDS.java b/hutool-db/src/main/java/cn/hutool/db/nosql/redis/RedisDS.java deleted file mode 100755 index 277eb75e0..000000000 --- a/hutool-db/src/main/java/cn/hutool/db/nosql/redis/RedisDS.java +++ /dev/null @@ -1,188 +0,0 @@ -package cn.hutool.db.nosql.redis; - -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.text.StrUtil; -import cn.hutool.setting.Setting; -import redis.clients.jedis.Jedis; -import redis.clients.jedis.JedisPool; -import redis.clients.jedis.JedisPoolConfig; -import redis.clients.jedis.Protocol; - -import java.io.Closeable; -import java.io.Serializable; - -/** - * Jedis数据源 - * - * @author looly - * @since 3.2.3 - */ -public class RedisDS implements Closeable, Serializable { - private static final long serialVersionUID = -5605411972456177456L; - /** 默认配置文件 */ - public final static String REDIS_CONFIG_PATH = "config/redis.setting"; - - /** 配置文件 */ - private Setting setting; - /** Jedis连接池 */ - private JedisPool pool; - - // --------------------------------------------------------------------------------- Static method start - /** - * 创建RedisDS,使用默认配置文件,默认分组 - * - * @return RedisDS - */ - public static RedisDS create() { - return new RedisDS(); - } - - /** - * 创建RedisDS,使用默认配置文件 - * - * @param group 配置文件中配置分组 - * @return RedisDS - */ - public static RedisDS create(final String group) { - return new RedisDS(group); - } - - /** - * 创建RedisDS - * - * @param setting 配置文件 - * @param group 配置文件中配置分组 - * @return RedisDS - */ - public static RedisDS create(final Setting setting, final String group) { - return new RedisDS(setting, group); - } - // --------------------------------------------------------------------------------- Static method end - - /** - * 构造,使用默认配置文件,默认分组 - */ - public RedisDS() { - this(null, null); - } - - /** - * 构造,使用默认配置文件 - * - * @param group 配置文件中配置分组 - */ - public RedisDS(final String group) { - this(null, group); - } - - /** - * 构造 - * - * @param setting 配置文件 - * @param group 配置文件中配置分组 - */ - public RedisDS(final Setting setting, final String group) { - this.setting = setting; - init(group); - } - - /** - * 初始化Jedis客户端 - * - * @param group Redis服务器信息分组 - * @return this - */ - public RedisDS init(final String group) { - if (null == setting) { - setting = new Setting(REDIS_CONFIG_PATH, true); - } - - final JedisPoolConfig config = new JedisPoolConfig(); - // 共用配置 - setting.toBean(config); - if (StrUtil.isNotBlank(group)) { - // 特有配置 - setting.toBean(group, config); - } - - //issue#I54TZ9 - final Long maxWaitMillis = setting.getLong("maxWaitMillis"); - if(null != maxWaitMillis){ - //noinspection deprecation - config.setMaxWaitMillis(maxWaitMillis); - } - - this.pool = new JedisPool(config, - // 地址 - setting.getStr("host", group, Protocol.DEFAULT_HOST), - // 端口 - setting.getInt("port", group, Protocol.DEFAULT_PORT), - // 连接超时 - setting.getInt("connectionTimeout", group, setting.getInt("timeout", group, Protocol.DEFAULT_TIMEOUT)), - // 读取数据超时 - setting.getInt("soTimeout", group, setting.getInt("timeout", group, Protocol.DEFAULT_TIMEOUT)), - // 密码 - setting.getStr("password", group, null), - // 数据库序号 - setting.getInt("database", group, Protocol.DEFAULT_DATABASE), - // 客户端名 - setting.getStr("clientName", group, "Hutool"), - // 是否使用SSL - setting.getBool("ssl", group, false), - // SSL相关,使用默认 - null, null, null); - - return this; - } - - /** - * 从资源池中获取{@link Jedis} - * - * @return {@link Jedis} - */ - public Jedis getJedis() { - return this.pool.getResource(); - } - - /** - * 从Redis中获取值 - * - * @param key 键 - * @return 值 - */ - public String getStr(final String key) { - try (final Jedis jedis = getJedis()) { - return jedis.get(key); - } - } - - /** - * 从Redis中获取值 - * - * @param key 键 - * @param value 值 - * @return 状态码 - */ - public String setStr(final String key, final String value) { - try (final Jedis jedis = getJedis()) { - return jedis.set(key, value); - } - } - - /** - * 从Redis中删除多个值 - * - * @param keys 需要删除值对应的键列表 - * @return 删除个数,0表示无key可删除 - */ - public Long del(final String... keys) { - try (final Jedis jedis = getJedis()) { - return jedis.del(keys); - } - } - - @Override - public void close() { - IoUtil.close(pool); - } -} diff --git a/hutool-db/src/main/java/cn/hutool/db/nosql/redis/package-info.java b/hutool-db/src/main/java/cn/hutool/db/nosql/redis/package-info.java deleted file mode 100644 index 1fecd753f..000000000 --- a/hutool-db/src/main/java/cn/hutool/db/nosql/redis/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Redis(Jedis)数据库操作的封装 - * - * @author looly - * - */ -package cn.hutool.db.nosql.redis; \ No newline at end of file diff --git a/hutool-db/src/main/java/cn/hutool/db/sql/ConditionBuilder.java b/hutool-db/src/main/java/cn/hutool/db/sql/ConditionBuilder.java index b03af24f6..e18f310a5 100644 --- a/hutool-db/src/main/java/cn/hutool/db/sql/ConditionBuilder.java +++ b/hutool-db/src/main/java/cn/hutool/db/sql/ConditionBuilder.java @@ -55,7 +55,7 @@ public class ConditionBuilder implements Builder { * @return 参数列表 */ public List getParamValues() { - return ListUtil.unmodifiable(this.paramValues); + return ListUtil.view(this.paramValues); } /** diff --git a/hutool-db/src/main/java/cn/hutool/db/sql/Query.java b/hutool-db/src/main/java/cn/hutool/db/sql/Query.java index 966984027..b352b37dd 100644 --- a/hutool-db/src/main/java/cn/hutool/db/sql/Query.java +++ b/hutool-db/src/main/java/cn/hutool/db/sql/Query.java @@ -1,6 +1,6 @@ package cn.hutool.db.sql; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.db.DbRuntimeException; import cn.hutool.db.Entity; @@ -113,7 +113,7 @@ public class Query implements Cloneable { * @return this */ public Query setFields(final String... fields) { - this.fields = CollUtil.newArrayList(fields); + this.fields = ListUtil.of(fields); return this; } diff --git a/hutool-db/src/test/java/cn/hutool/db/CRUDTest.java b/hutool-db/src/test/java/cn/hutool/db/CRUDTest.java index b511bd1a7..63f86e5ff 100644 --- a/hutool-db/src/test/java/cn/hutool/db/CRUDTest.java +++ b/hutool-db/src/test/java/cn/hutool/db/CRUDTest.java @@ -1,6 +1,6 @@ package cn.hutool.db; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.lang.Console; import cn.hutool.core.map.MapUtil; import cn.hutool.db.handler.EntityListHandler; @@ -26,75 +26,75 @@ public class CRUDTest { @Test public void findIsNullTest() { - final List results = db.findAll(Entity.create("user").set("age", "is null")); + final List results = db.findAll(Entity.of("user").set("age", "is null")); Assert.assertEquals(0, results.size()); } @Test public void findIsNullTest2() { - final List results = db.findAll(Entity.create("user").set("age", "= null")); + final List results = db.findAll(Entity.of("user").set("age", "= null")); Assert.assertEquals(0, results.size()); } @Test public void findIsNullTest3() { - final List results = db.findAll(Entity.create("user").set("age", null)); + final List results = db.findAll(Entity.of("user").set("age", null)); Assert.assertEquals(0, results.size()); } @Test public void findBetweenTest() { - final List results = db.findAll(Entity.create("user").set("age", "between '18' and '40'")); + final List results = db.findAll(Entity.of("user").set("age", "between '18' and '40'")); Assert.assertEquals(1, results.size()); } @Test public void findByBigIntegerTest() { - final List results = db.findAll(Entity.create("user").set("age", new BigInteger("12"))); + final List results = db.findAll(Entity.of("user").set("age", new BigInteger("12"))); Assert.assertEquals(2, results.size()); } @Test public void findByBigDecimalTest() { - final List results = db.findAll(Entity.create("user").set("age", new BigDecimal("12"))); + final List results = db.findAll(Entity.of("user").set("age", new BigDecimal("12"))); Assert.assertEquals(2, results.size()); } @Test public void findLikeTest() { - final List results = db.findAll(Entity.create("user").set("name", "like \"%三%\"")); + final List results = db.findAll(Entity.of("user").set("name", "like \"%三%\"")); Assert.assertEquals(2, results.size()); } @Test public void findLikeTest2() { - final List results = db.findAll(Entity.create("user").set("name", new Condition("name", "三", LikeType.Contains))); + final List results = db.findAll(Entity.of("user").set("name", new Condition("name", "三", LikeType.Contains))); Assert.assertEquals(2, results.size()); } @Test public void findLikeTest3() { - final List results = db.findAll(Entity.create("user").set("name", new Condition("name", null, LikeType.Contains))); + final List results = db.findAll(Entity.of("user").set("name", new Condition("name", null, LikeType.Contains))); Assert.assertEquals(0, results.size()); } @Test public void findInTest() { - final List results = db.findAll(Entity.create("user").set("id", "in 1,2,3")); + final List results = db.findAll(Entity.of("user").set("id", "in 1,2,3")); Console.log(results); Assert.assertEquals(2, results.size()); } @Test public void findInTest2() { - final List results = db.findAll(Entity.create("user") + final List results = db.findAll(Entity.of("user") .set("id", new Condition("id", new long[]{1, 2, 3}))); Assert.assertEquals(2, results.size()); } @Test public void findInTest3() { - final List results = db.findAll(Entity.create("user") + final List results = db.findAll(Entity.of("user") .set("id", new long[]{1, 2, 3})); Assert.assertEquals(2, results.size()); } @@ -107,7 +107,7 @@ public class CRUDTest { @Test public void findTest() { - final List find = db.find(CollUtil.newArrayList("name AS name2"), Entity.create("user"), new EntityListHandler()); + final List find = db.find(ListUtil.of("name AS name2"), Entity.of("user"), new EntityListHandler()); Assert.assertFalse(find.isEmpty()); } @@ -128,13 +128,13 @@ public class CRUDTest { public void crudTest() { // 增 - final Long id = db.insertForGeneratedKey(Entity.create("user").set("name", "unitTestUser").set("age", 66)); + final Long id = db.insertForGeneratedKey(Entity.of("user").set("name", "unitTestUser").set("age", 66)); Assert.assertTrue(id > 0); final Entity result = db.get("user", "name", "unitTestUser"); Assert.assertSame(66, result.getInt("age")); // 改 - final int update = db.update(Entity.create().set("age", 88), Entity.create("user").set("name", "unitTestUser")); + final int update = db.update(Entity.of().set("age", 88), Entity.of("user").set("name", "unitTestUser")); Assert.assertTrue(update > 0); final Entity result2 = db.get("user", "name", "unitTestUser"); Assert.assertSame(88, result2.getInt("age")); @@ -168,7 +168,7 @@ public class CRUDTest { Console.log(data1); Console.log(data2); - final int[] result = db.insert(CollUtil.newArrayList(data1, data2)); + final int[] result = db.insert(ListUtil.of(data1, data2)); Console.log(result); } @@ -185,7 +185,7 @@ public class CRUDTest { Console.log(data1); - final int[] result = db.insert(CollUtil.newArrayList(data1)); + final int[] result = db.insert(ListUtil.of(data1)); Console.log(result); } diff --git a/hutool-db/src/test/java/cn/hutool/db/ConcurentTest.java b/hutool-db/src/test/java/cn/hutool/db/ConcurentTest.java index bd00ee57d..4a26b2d3e 100755 --- a/hutool-db/src/test/java/cn/hutool/db/ConcurentTest.java +++ b/hutool-db/src/test/java/cn/hutool/db/ConcurentTest.java @@ -1,6 +1,6 @@ package cn.hutool.db; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.lang.Console; import cn.hutool.core.thread.ThreadUtil; import cn.hutool.db.handler.EntityListHandler; @@ -31,7 +31,7 @@ public class ConcurentTest { for(int i = 0; i < 10000; i++) { ThreadUtil.execute(() -> { final List find; - find = db.find(CollUtil.newArrayList("name AS name2"), Entity.create("user"), new EntityListHandler()); + find = db.find(ListUtil.of("name AS name2"), Entity.of("user"), new EntityListHandler()); Console.log(find); }); } diff --git a/hutool-db/src/test/java/cn/hutool/db/DbTest.java b/hutool-db/src/test/java/cn/hutool/db/DbTest.java index 45e933b0c..2b9524105 100644 --- a/hutool-db/src/test/java/cn/hutool/db/DbTest.java +++ b/hutool-db/src/test/java/cn/hutool/db/DbTest.java @@ -27,17 +27,17 @@ public class DbTest { @Test public void findTest() { - final List find = Db.of().find(Entity.create("user").set("age", 18)); + final List find = Db.of().find(Entity.of("user").set("age", 18)); Assert.assertEquals("王五", find.get(0).get("name")); } @Test public void pageTest() { // 测试数据库中一共4条数据,第0页有3条,第1页有1条 - final List page0 = Db.of().page(Entity.create("user"), Page.of(0, 3)); + final List page0 = Db.of().page(Entity.of("user"), Page.of(0, 3)); Assert.assertEquals(3, page0.size()); - final List page1 = Db.of().page(Entity.create("user"), Page.of(1, 3)); + final List page1 = Db.of().page(Entity.of("user"), Page.of(1, 3)); Assert.assertEquals(1, page1.size()); } @@ -71,6 +71,12 @@ public class DbTest { Assert.assertEquals(4, count); } + @Test + public void countByQueryTest() { + final long count = Db.of().count(Entity.of("user")); + Assert.assertEquals(4, count); + } + @Test public void countTest2() { final long count = Db.of().count("select * from user order by name DESC"); @@ -80,7 +86,7 @@ public class DbTest { @Test public void findLikeTest() { // 方式1 - List find = Db.of().find(Entity.create("user").set("name", "like 王%")); + List find = Db.of().find(Entity.of("user").set("name", "like 王%")); Assert.assertEquals("王五", find.get(0).get("name")); // 方式2 @@ -108,8 +114,8 @@ public class DbTest { @Ignore public void txTest() throws SQLException { Db.of().tx(db -> { - db.insert(Entity.create("user").set("name", "unitTestuser2")); - db.update(Entity.create().set("age", 79), Entity.create("user").set("name", "unitTestuser2")); + db.insert(Entity.of("user").set("name", "unitTestuser2")); + db.update(Entity.of().set("age", 79), Entity.of("user").set("name", "unitTestuser2")); db.del("user", "name", "unitTestuser2"); }); } diff --git a/hutool-db/src/test/java/cn/hutool/db/DerbyTest.java b/hutool-db/src/test/java/cn/hutool/db/DerbyTest.java index 3617ebef6..ed410c89b 100644 --- a/hutool-db/src/test/java/cn/hutool/db/DerbyTest.java +++ b/hutool-db/src/test/java/cn/hutool/db/DerbyTest.java @@ -23,10 +23,10 @@ public class DerbyTest { final Db db = Db.of(DS_GROUP_NAME); db.execute("CREATE TABLE test(a INTEGER, b BIGINT)"); - db.insert(Entity.create("test").set("a", 1).set("b", 11)); - db.insert(Entity.create("test").set("a", 2).set("b", 21)); - db.insert(Entity.create("test").set("a", 3).set("b", 31)); - db.insert(Entity.create("test").set("a", 4).set("b", 41)); + db.insert(Entity.of("test").set("a", 1).set("b", 11)); + db.insert(Entity.of("test").set("a", 2).set("b", 21)); + db.insert(Entity.of("test").set("a", 3).set("b", 31)); + db.insert(Entity.of("test").set("a", 4).set("b", 41)); } @Test @@ -39,7 +39,7 @@ public class DerbyTest { @Test @Ignore public void findTest() throws SQLException { - final List query = Db.of(DS_GROUP_NAME).find(Entity.create("test")); + final List query = Db.of(DS_GROUP_NAME).find(Entity.of("test")); Assert.assertEquals(4, query.size()); } } diff --git a/hutool-db/src/test/java/cn/hutool/db/EntityTest.java b/hutool-db/src/test/java/cn/hutool/db/EntityTest.java index 640a7344e..0ba97fb46 100644 --- a/hutool-db/src/test/java/cn/hutool/db/EntityTest.java +++ b/hutool-db/src/test/java/cn/hutool/db/EntityTest.java @@ -18,7 +18,7 @@ public class EntityTest { user.setId(1); user.setName("test"); - final Entity entity = Entity.create("testTable").parseBean(user); + final Entity entity = Entity.of("testTable").parseBean(user); Assert.assertEquals(Integer.valueOf(1), entity.getInt("id")); Assert.assertEquals("test", entity.getStr("name")); } @@ -29,7 +29,7 @@ public class EntityTest { user.setId(1); user.setName("test"); - final Entity entity = Entity.create().parseBean(user); + final Entity entity = Entity.of().parseBean(user); Assert.assertEquals(Integer.valueOf(1), entity.getInt("id")); Assert.assertEquals("test", entity.getStr("name")); Assert.assertEquals("user", entity.getTableName()); @@ -40,7 +40,7 @@ public class EntityTest { final User user = new User(); user.setName("test"); - final Entity entity = Entity.create().parseBean(user, false, true); + final Entity entity = Entity.of().parseBean(user, false, true); Assert.assertFalse(entity.containsKey("id")); Assert.assertEquals("test", entity.getStr("name")); @@ -49,7 +49,7 @@ public class EntityTest { @Test public void entityToBeanIgnoreCaseTest() { - final Entity entity = Entity.create().set("ID", 2).set("NAME", "testName"); + final Entity entity = Entity.of().set("ID", 2).set("NAME", "testName"); final User user = entity.toBeanIgnoreCase(User.class); Assert.assertEquals(Integer.valueOf(2), user.getId()); diff --git a/hutool-db/src/test/java/cn/hutool/db/FindBeanTest.java b/hutool-db/src/test/java/cn/hutool/db/FindBeanTest.java index 5364a614f..ee40c07c2 100644 --- a/hutool-db/src/test/java/cn/hutool/db/FindBeanTest.java +++ b/hutool-db/src/test/java/cn/hutool/db/FindBeanTest.java @@ -5,7 +5,6 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import java.sql.SQLException; import java.util.List; /** @@ -25,7 +24,7 @@ public class FindBeanTest { @Test public void findAllBeanTest() { - final List results = db.findAll(Entity.create("user"), User.class); + final List results = db.findAll(Entity.of("user"), User.class); Assert.assertEquals(4, results.size()); Assert.assertEquals(Integer.valueOf(1), results.get(0).getId()); @@ -35,7 +34,7 @@ public class FindBeanTest { @Test @SuppressWarnings("rawtypes") public void findAllListTest() { - final List results = db.findAll(Entity.create("user"), List.class); + final List results = db.findAll(Entity.of("user"), List.class); Assert.assertEquals(4, results.size()); Assert.assertEquals(1, results.get(0).get(0)); @@ -44,7 +43,7 @@ public class FindBeanTest { @Test public void findAllArrayTest() { - final List results = db.findAll(Entity.create("user"), Object[].class); + final List results = db.findAll(Entity.of("user"), Object[].class); Assert.assertEquals(4, results.size()); Assert.assertEquals(1, results.get(0)[0]); @@ -53,13 +52,13 @@ public class FindBeanTest { @Test public void findAllStringTest() { - final List results = db.findAll(Entity.create("user"), String.class); + final List results = db.findAll(Entity.of("user"), String.class); Assert.assertEquals(4, results.size()); } @Test public void findAllStringArrayTest() { - final List results = db.findAll(Entity.create("user"), String[].class); + final List results = db.findAll(Entity.of("user"), String[].class); Assert.assertEquals(4, results.size()); Assert.assertEquals("1", results.get(0)[0]); diff --git a/hutool-db/src/test/java/cn/hutool/db/H2Test.java b/hutool-db/src/test/java/cn/hutool/db/H2Test.java index 3b438a1ee..9df6de64d 100644 --- a/hutool-db/src/test/java/cn/hutool/db/H2Test.java +++ b/hutool-db/src/test/java/cn/hutool/db/H2Test.java @@ -21,10 +21,10 @@ public class H2Test { final Db db = Db.of(DS_GROUP_NAME); db.execute("CREATE TABLE test(a INTEGER, b BIGINT)"); - db.insert(Entity.create("test").set("a", 1).set("b", 11)); - db.insert(Entity.create("test").set("a", 2).set("b", 21)); - db.insert(Entity.create("test").set("a", 3).set("b", 31)); - db.insert(Entity.create("test").set("a", 4).set("b", 41)); + db.insert(Entity.of("test").set("a", 1).set("b", 11)); + db.insert(Entity.of("test").set("a", 2).set("b", 21)); + db.insert(Entity.of("test").set("a", 3).set("b", 31)); + db.insert(Entity.of("test").set("a", 4).set("b", 41)); } @Test @@ -35,14 +35,14 @@ public class H2Test { @Test public void findTest() { - final List query = Db.of(DS_GROUP_NAME).find(Entity.create("test")); + final List query = Db.of(DS_GROUP_NAME).find(Entity.of("test")); Assert.assertEquals(4, query.size()); } @Test public void upsertTest() { final Db db=Db.of(DS_GROUP_NAME); - db.upsert(Entity.create("test").set("a",1).set("b",111),"a"); + db.upsert(Entity.of("test").set("a",1).set("b",111),"a"); final Entity a1=db.get("test","a",1); Assert.assertEquals(Long.valueOf(111),a1.getLong("b")); } diff --git a/hutool-db/src/test/java/cn/hutool/db/HsqldbTest.java b/hutool-db/src/test/java/cn/hutool/db/HsqldbTest.java index 2856fe14a..049758ced 100644 --- a/hutool-db/src/test/java/cn/hutool/db/HsqldbTest.java +++ b/hutool-db/src/test/java/cn/hutool/db/HsqldbTest.java @@ -20,10 +20,10 @@ public class HsqldbTest { public static void init() { final Db db = Db.of(DS_GROUP_NAME); db.execute("CREATE TABLE test(a INTEGER, b BIGINT)"); - db.insert(Entity.create("test").set("a", 1).set("b", 11)); - db.insert(Entity.create("test").set("a", 2).set("b", 21)); - db.insert(Entity.create("test").set("a", 3).set("b", 31)); - db.insert(Entity.create("test").set("a", 4).set("b", 41)); + db.insert(Entity.of("test").set("a", 1).set("b", 11)); + db.insert(Entity.of("test").set("a", 2).set("b", 21)); + db.insert(Entity.of("test").set("a", 3).set("b", 31)); + db.insert(Entity.of("test").set("a", 4).set("b", 41)); } @Test @@ -34,7 +34,7 @@ public class HsqldbTest { @Test public void findTest() { - final List query = Db.of(DS_GROUP_NAME).find(Entity.create("test")); + final List query = Db.of(DS_GROUP_NAME).find(Entity.of("test")); Assert.assertEquals(4, query.size()); } } diff --git a/hutool-db/src/test/java/cn/hutool/db/MySQLTest.java b/hutool-db/src/test/java/cn/hutool/db/MySQLTest.java index 69d07dc1a..88757d74b 100755 --- a/hutool-db/src/test/java/cn/hutool/db/MySQLTest.java +++ b/hutool-db/src/test/java/cn/hutool/db/MySQLTest.java @@ -26,7 +26,7 @@ public class MySQLTest { @Ignore public void insertTest() { for (int id = 100; id < 200; id++) { - Db.of("mysql").insert(Entity.create("user")// + Db.of("mysql").insert(Entity.of("user")// .set("id", id)// .set("name", "测试用户" + id)// .set("text", "描述" + id)// @@ -45,20 +45,20 @@ public class MySQLTest { @Ignore public void txTest() throws SQLException { Db.of("mysql").tx(db -> { - final int update = db.update(Entity.create("user").set("text", "描述100"), Entity.create().set("id", 100)); - db.update(Entity.create("user").set("text", "描述101"), Entity.create().set("id", 101)); + final int update = db.update(Entity.of("user").set("text", "描述100"), Entity.of().set("id", 100)); + db.update(Entity.of("user").set("text", "描述101"), Entity.of().set("id", 101)); if (1 == update) { // 手动指定异常,然后测试回滚触发 throw new RuntimeException("Error"); } - db.update(Entity.create("user").set("text", "描述102"), Entity.create().set("id", 102)); + db.update(Entity.of("user").set("text", "描述102"), Entity.of().set("id", 102)); }); } @Test @Ignore public void pageTest() { - final PageResult result = Db.of("mysql").page(Entity.create("user"), new Page(2, 10)); + final PageResult result = Db.of("mysql").page(Entity.of("user"), new Page(2, 10)); for (final Entity entity : result) { Console.log(entity.get("id")); } @@ -75,9 +75,9 @@ public class MySQLTest { @Ignore public void upsertTest() { final Db db = Db.of("mysql"); - db.insert(Entity.create("testuser").set("id", 1).set("account", "ice").set("pass", "123456")); - db.upsert(Entity.create("testuser").set("id", 1).set("account", "icefairy").set("pass", "a123456")); - final Entity user = db.get(Entity.create("testuser").set("id", 1)); + db.insert(Entity.of("testuser").set("id", 1).set("account", "ice").set("pass", "123456")); + db.upsert(Entity.of("testuser").set("id", 1).set("account", "icefairy").set("pass", "a123456")); + final Entity user = db.get(Entity.of("testuser").set("id", 1)); System.out.println("user======="+user.getStr("account")+"___"+user.getStr("pass")); Assert.assertEquals(user.getStr("account"), "icefairy"); } diff --git a/hutool-db/src/test/java/cn/hutool/db/OracleTest.java b/hutool-db/src/test/java/cn/hutool/db/OracleTest.java index 47f972b9b..0cbbf2842 100755 --- a/hutool-db/src/test/java/cn/hutool/db/OracleTest.java +++ b/hutool-db/src/test/java/cn/hutool/db/OracleTest.java @@ -19,7 +19,7 @@ public class OracleTest { @Test public void oraclePageSqlTest() { final Page page = new Page(0, 10); - final Entity where = Entity.create("PMCPERFORMANCEINFO").set("yearPI", "2017"); + final Entity where = Entity.of("PMCPERFORMANCEINFO").set("yearPI", "2017"); final Query query = new Query(SqlUtil.buildConditions(where), where.getTableName()); query.setPage(page); @@ -41,7 +41,7 @@ public class OracleTest { @Ignore public void insertTest() { for (int id = 100; id < 200; id++) { - Db.of("orcl").insert(Entity.create("T_USER")// + Db.of("orcl").insert(Entity.of("T_USER")// .set("ID", id)// .set("name", "测试用户" + id)// .set("TEXT", "描述" + id)// @@ -53,7 +53,7 @@ public class OracleTest { @Test @Ignore public void pageTest() { - final PageResult result = Db.of("orcl").page(Entity.create("T_USER"), new Page(2, 10)); + final PageResult result = Db.of("orcl").page(Entity.of("T_USER"), new Page(2, 10)); for (final Entity entity : result) { Console.log(entity.get("ID")); } diff --git a/hutool-db/src/test/java/cn/hutool/db/PicTransferTest.java b/hutool-db/src/test/java/cn/hutool/db/PicTransferTest.java index 87964dd65..9d1e70dc3 100644 --- a/hutool-db/src/test/java/cn/hutool/db/PicTransferTest.java +++ b/hutool-db/src/test/java/cn/hutool/db/PicTransferTest.java @@ -15,8 +15,8 @@ public class PicTransferTest { @Ignore public void findTest() { Db.of().find( - ListUtil.of("NAME", "TYPE", "GROUP", "PIC"), - Entity.create("PIC_INFO").set("TYPE", 1), + ListUtil.view("NAME", "TYPE", "GROUP", "PIC"), + Entity.of("PIC_INFO").set("TYPE", 1), rs -> { while(rs.next()){ save(rs); diff --git a/hutool-db/src/test/java/cn/hutool/db/PostgreTest.java b/hutool-db/src/test/java/cn/hutool/db/PostgreTest.java index 6a47b4070..18d4d82f0 100644 --- a/hutool-db/src/test/java/cn/hutool/db/PostgreTest.java +++ b/hutool-db/src/test/java/cn/hutool/db/PostgreTest.java @@ -16,7 +16,7 @@ public class PostgreTest { @Ignore public void insertTest() { for (int id = 100; id < 200; id++) { - Db.of("postgre").insert(Entity.create("user")// + Db.of("postgre").insert(Entity.of("user")// .set("id", id)// .set("name", "测试用户" + id)// ); @@ -26,7 +26,7 @@ public class PostgreTest { @Test @Ignore public void pageTest() { - final PageResult result = Db.of("postgre").page(Entity.create("user"), new Page(2, 10)); + final PageResult result = Db.of("postgre").page(Entity.of("user"), new Page(2, 10)); for (final Entity entity : result) { Console.log(entity.get("id")); } @@ -38,9 +38,9 @@ public class PostgreTest { final Db db = Db.of("postgre"); db.executeBatch("drop table if exists ctest", "create table if not exists \"ctest\" ( \"id\" serial4, \"t1\" varchar(255) COLLATE \"pg_catalog\".\"default\", \"t2\" varchar(255) COLLATE \"pg_catalog\".\"default\", \"t3\" varchar(255) COLLATE \"pg_catalog\".\"default\", CONSTRAINT \"ctest_pkey\" PRIMARY KEY (\"id\") ) "); - db.insert(Entity.create("ctest").set("id", 1).set("t1", "111").set("t2", "222").set("t3", "333")); - db.upsert(Entity.create("ctest").set("id", 1).set("t1", "new111").set("t2", "new222").set("t3", "bew333"),"id"); - final Entity et=db.get(Entity.create("ctest").set("id", 1)); + db.insert(Entity.of("ctest").set("id", 1).set("t1", "111").set("t2", "222").set("t3", "333")); + db.upsert(Entity.of("ctest").set("id", 1).set("t1", "new111").set("t2", "new222").set("t3", "bew333"),"id"); + final Entity et=db.get(Entity.of("ctest").set("id", 1)); Assert.assertEquals("new111",et.getStr("t1")); } } diff --git a/hutool-db/src/test/java/cn/hutool/db/SessionTest.java b/hutool-db/src/test/java/cn/hutool/db/SessionTest.java index 122ed59d5..1dec67074 100644 --- a/hutool-db/src/test/java/cn/hutool/db/SessionTest.java +++ b/hutool-db/src/test/java/cn/hutool/db/SessionTest.java @@ -15,13 +15,13 @@ public class SessionTest { public void transTest() { final Session session = Session.of("test"); session.beginTransaction(); - session.update(Entity.create().set("age", 76), Entity.create("user").set("name", "unitTestUser")); + session.update(Entity.of().set("age", 76), Entity.of("user").set("name", "unitTestUser")); session.commit(); } @Test @Ignore public void txTest() { - Session.of("test").tx(session -> session.update(Entity.create().set("age", 78), Entity.create("user").set("name", "unitTestUser"))); + Session.of("test").tx(session -> session.update(Entity.of().set("age", 78), Entity.of("user").set("name", "unitTestUser"))); } } diff --git a/hutool-db/src/test/java/cn/hutool/db/SqlServerTest.java b/hutool-db/src/test/java/cn/hutool/db/SqlServerTest.java index 91d910479..ed790572f 100755 --- a/hutool-db/src/test/java/cn/hutool/db/SqlServerTest.java +++ b/hutool-db/src/test/java/cn/hutool/db/SqlServerTest.java @@ -22,7 +22,7 @@ public class SqlServerTest { @Ignore public void insertTest() { for (int id = 100; id < 200; id++) { - Db.of("sqlserver").insert(Entity.create("T_USER")// + Db.of("sqlserver").insert(Entity.of("T_USER")// .set("ID", id)// .set("name", "测试用户" + id)// ); @@ -32,7 +32,7 @@ public class SqlServerTest { @Test @Ignore public void pageTest() { - final PageResult result = Db.of("sqlserver").page(Entity.create("T_USER"), new Page(2, 10)); + final PageResult result = Db.of("sqlserver").page(Entity.of("T_USER"), new Page(2, 10)); for (final Entity entity : result) { Console.log(entity.get("ID")); } diff --git a/hutool-db/src/test/java/cn/hutool/db/UpdateTest.java b/hutool-db/src/test/java/cn/hutool/db/UpdateTest.java index b48b7aa23..9243bf1a2 100644 --- a/hutool-db/src/test/java/cn/hutool/db/UpdateTest.java +++ b/hutool-db/src/test/java/cn/hutool/db/UpdateTest.java @@ -23,7 +23,7 @@ public class UpdateTest { public void updateTest() { // 改 - final int update = db.update(Entity.create("user").set("age", 88), Entity.create().set("name", "unitTestUser")); + final int update = db.update(Entity.of("user").set("age", 88), Entity.of().set("name", "unitTestUser")); Assert.assertTrue(update > 0); final Entity result2 = db.get("user", "name", "unitTestUser"); Assert.assertSame(88, result2.getInt("age")); diff --git a/hutool-db/src/test/java/cn/hutool/db/meta/MetaUtilTest.java b/hutool-db/src/test/java/cn/hutool/db/meta/MetaUtilTest.java index 5780f2386..0c5f65dd4 100644 --- a/hutool-db/src/test/java/cn/hutool/db/meta/MetaUtilTest.java +++ b/hutool-db/src/test/java/cn/hutool/db/meta/MetaUtilTest.java @@ -1,6 +1,6 @@ package cn.hutool.db.meta; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.SetUtil; import cn.hutool.core.text.StrUtil; import cn.hutool.db.ds.DSFactory; import org.junit.Assert; @@ -27,7 +27,7 @@ public class MetaUtilTest { @Test public void getTableMetaTest() { final Table table = MetaUtil.getTableMeta(ds, "user"); - Assert.assertEquals(CollUtil.newHashSet("id"), table.getPkNames()); + Assert.assertEquals(SetUtil.of("id"), table.getPkNames()); } @Test diff --git a/hutool-db/src/test/java/cn/hutool/db/nosql/MongoDBTest.java b/hutool-db/src/test/java/cn/hutool/db/nosql/MongoDBTest.java deleted file mode 100644 index 9b4940608..000000000 --- a/hutool-db/src/test/java/cn/hutool/db/nosql/MongoDBTest.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.hutool.db.nosql; - -import cn.hutool.db.nosql.mongo.MongoFactory; -import com.mongodb.client.MongoDatabase; -import org.junit.Assert; -import org.junit.Ignore; -import org.junit.Test; - -/** - * @author VampireAchao - */ -public class MongoDBTest { - - @Test - @Ignore - public void mongoDSTest() { - final MongoDatabase db = MongoFactory.getDS("master").getDb("test"); - Assert.assertEquals("test", db.getName()); - } -} diff --git a/hutool-db/src/test/java/cn/hutool/db/nosql/RedisDSTest.java b/hutool-db/src/test/java/cn/hutool/db/nosql/RedisDSTest.java deleted file mode 100644 index 416830f52..000000000 --- a/hutool-db/src/test/java/cn/hutool/db/nosql/RedisDSTest.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.hutool.db.nosql; - -import cn.hutool.db.nosql.redis.RedisDS; -import org.junit.Ignore; -import org.junit.Test; -import redis.clients.jedis.Jedis; - -public class RedisDSTest { - - @Test - @Ignore - public void redisDSTest(){ - final Jedis jedis = RedisDS.create().getJedis(); - } -} diff --git a/hutool-db/src/test/java/cn/hutool/db/sql/ConditionGroupTest.java b/hutool-db/src/test/java/cn/hutool/db/sql/ConditionGroupTest.java index b081741d2..1e57695b7 100644 --- a/hutool-db/src/test/java/cn/hutool/db/sql/ConditionGroupTest.java +++ b/hutool-db/src/test/java/cn/hutool/db/sql/ConditionGroupTest.java @@ -23,6 +23,6 @@ public class ConditionGroupTest { final ConditionBuilder conditionBuilder = ConditionBuilder.of(cg2, condition4); Assert.assertEquals("((a = ? OR b = ?) AND c = ?) AND d = ?", conditionBuilder.build()); - Assert.assertEquals(ListUtil.of("A", "B", "C", "D"), conditionBuilder.getParamValues()); + Assert.assertEquals(ListUtil.view("A", "B", "C", "D"), conditionBuilder.getParamValues()); } } diff --git a/hutool-extra/pom.xml b/hutool-extra/pom.xml index 93482b39a..58976323c 100755 --- a/hutool-extra/pom.xml +++ b/hutool-extra/pom.xml @@ -27,7 +27,7 @@ 1.6.2 0.1.55 0.33.0 - 3.4.1 + 3.5.0 3.8.0 5.1.1 4.0.1 @@ -140,12 +140,18 @@ - com.sun.mail - javax.mail - ${mail.version} + jakarta.mail + jakarta.mail-api + 2.1.0 compile true + + com.sun.mail + jakarta.mail + 2.0.1 + test + diff --git a/hutool-extra/src/main/java/cn/hutool/extra/cglib/BeanCopierCache.java b/hutool-extra/src/main/java/cn/hutool/extra/cglib/BeanCopierCache.java index 4d882a98d..ff54db04c 100755 --- a/hutool-extra/src/main/java/cn/hutool/extra/cglib/BeanCopierCache.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/cglib/BeanCopierCache.java @@ -43,7 +43,7 @@ public enum BeanCopierCache { */ public BeanCopier get(final Class srcClass, final Class targetClass, final boolean useConverter) { final String key = genKey(srcClass, targetClass, useConverter); - return cache.computeIfAbsent(key, () -> BeanCopier.create(srcClass, targetClass, useConverter)); + return cache.computeIfAbsent(key, (k) -> BeanCopier.create(srcClass, targetClass, useConverter)); } /** diff --git a/hutool-extra/src/main/java/cn/hutool/extra/mail/InternalMailUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/mail/InternalMailUtil.java index 66297163e..9c183f908 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/mail/InternalMailUtil.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/mail/InternalMailUtil.java @@ -2,9 +2,9 @@ package cn.hutool.extra.mail; import cn.hutool.core.util.ArrayUtil; -import javax.mail.internet.AddressException; -import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeUtility; +import jakarta.mail.internet.AddressException; +import jakarta.mail.internet.InternetAddress; +import jakarta.mail.internet.MimeUtility; import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import java.util.ArrayList; diff --git a/hutool-extra/src/main/java/cn/hutool/extra/mail/Mail.java b/hutool-extra/src/main/java/cn/hutool/extra/mail/Mail.java index 523265b44..36c0695e7 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/mail/Mail.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/mail/Mail.java @@ -8,21 +8,21 @@ import cn.hutool.core.text.StrUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjUtil; -import javax.activation.DataHandler; -import javax.activation.DataSource; -import javax.activation.FileDataSource; -import javax.activation.FileTypeMap; -import javax.mail.Address; -import javax.mail.MessagingException; -import javax.mail.Multipart; -import javax.mail.SendFailedException; -import javax.mail.Session; -import javax.mail.Transport; -import javax.mail.internet.MimeBodyPart; -import javax.mail.internet.MimeMessage; -import javax.mail.internet.MimeMultipart; -import javax.mail.internet.MimeUtility; -import javax.mail.util.ByteArrayDataSource; +import jakarta.activation.DataHandler; +import jakarta.activation.DataSource; +import jakarta.activation.FileDataSource; +import jakarta.activation.FileTypeMap; +import jakarta.mail.Address; +import jakarta.mail.MessagingException; +import jakarta.mail.Multipart; +import jakarta.mail.SendFailedException; +import jakarta.mail.Session; +import jakarta.mail.Transport; +import jakarta.mail.internet.MimeBodyPart; +import jakarta.mail.internet.MimeMessage; +import jakarta.mail.internet.MimeMultipart; +import jakarta.mail.internet.MimeUtility; +import jakarta.mail.util.ByteArrayDataSource; import java.io.File; import java.io.IOException; import java.io.InputStream; diff --git a/hutool-extra/src/main/java/cn/hutool/extra/mail/MailAccount.java b/hutool-extra/src/main/java/cn/hutool/extra/mail/MailAccount.java index b20dc9374..f5efacde3 100755 --- a/hutool-extra/src/main/java/cn/hutool/extra/mail/MailAccount.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/mail/MailAccount.java @@ -23,8 +23,9 @@ public class MailAccount implements Serializable { private static final String SMTP_HOST = "mail.smtp.host"; private static final String SMTP_PORT = "mail.smtp.port"; private static final String SMTP_AUTH = "mail.smtp.auth"; - private static final String SMTP_CONNECTION_TIMEOUT = "mail.smtp.connectiontimeout"; private static final String SMTP_TIMEOUT = "mail.smtp.timeout"; + private static final String SMTP_CONNECTION_TIMEOUT = "mail.smtp.connectiontimeout"; + private static final String SMTP_WRITE_TIMEOUT = "mail.smtp.writetimeout"; // SSL private static final String STARTTLS_ENABLE = "mail.smtp.starttls.enable"; @@ -117,11 +118,17 @@ public class MailAccount implements Serializable { * SMTP超时时长,单位毫秒,缺省值不超时 */ private long timeout; + /** * Socket连接超时值,单位毫秒,缺省值不超时 */ private long connectionTimeout; + /** + * Socket写出超时值,单位毫秒,缺省值不超时 + */ + private long writeTimeout; + /** * 自定义的其他属性,此自定义属性会覆盖默认属性 */ @@ -518,6 +525,17 @@ public class MailAccount implements Serializable { return this; } + /** + * 设置Socket写出超时值,单位毫秒,缺省值不超时 + * + * @param writeTimeout Socket写出超时值,单位毫秒,缺省值不超时 + * @return this + */ + public MailAccount setWriteTimeout(final long writeTimeout) { + this.writeTimeout = writeTimeout; + return this; + } + /** * 获取自定义属性列表 * @@ -563,6 +581,10 @@ public class MailAccount implements Serializable { if (this.connectionTimeout > 0) { p.put(SMTP_CONNECTION_TIMEOUT, String.valueOf(this.connectionTimeout)); } + // issue#2355 + if (this.writeTimeout > 0) { + p.put(SMTP_WRITE_TIMEOUT, String.valueOf(this.writeTimeout)); + } p.put(MAIL_DEBUG, String.valueOf(this.debug)); diff --git a/hutool-extra/src/main/java/cn/hutool/extra/mail/MailUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/mail/MailUtil.java index a2c64eb15..888842d8d 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/mail/MailUtil.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/mail/MailUtil.java @@ -1,13 +1,14 @@ package cn.hutool.extra.mail; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.CharUtil; import cn.hutool.core.text.StrUtil; -import javax.mail.Authenticator; -import javax.mail.Session; +import jakarta.mail.Authenticator; +import jakarta.mail.Session; import java.io.File; import java.io.InputStream; import java.util.Collection; @@ -433,7 +434,7 @@ public class MailUtil { } else if (StrUtil.contains(addresses, ';')) { result = StrUtil.splitTrim(addresses, ';'); } else { - result = CollUtil.newArrayList(addresses); + result = ListUtil.of(addresses); } return result; } diff --git a/hutool-extra/src/main/java/cn/hutool/extra/mail/UserPassAuthenticator.java b/hutool-extra/src/main/java/cn/hutool/extra/mail/UserPassAuthenticator.java index db4e5837b..b10f70292 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/mail/UserPassAuthenticator.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/mail/UserPassAuthenticator.java @@ -1,7 +1,7 @@ package cn.hutool.extra.mail; -import javax.mail.Authenticator; -import javax.mail.PasswordAuthentication; +import jakarta.mail.Authenticator; +import jakarta.mail.PasswordAuthentication; /** * 用户名密码验证器 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrConfig.java b/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrConfig.java index 2a67a085e..f8f7c05b7 100755 --- a/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrConfig.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrConfig.java @@ -32,7 +32,7 @@ public class QrConfig { protected int foreColor = BLACK; /** 背景色,默认白色,null表示透明 */ protected Integer backColor = WHITE; - /** 边距1~4 */ + /** 边距0~4 */ protected Integer margin = 2; /** 设置二维码中的信息量,可设置0-40的整数 */ protected Integer qrVersion; diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ssh/SshjSftp.java b/hutool-extra/src/main/java/cn/hutool/extra/ssh/SshjSftp.java index 366ced51b..e07d08731 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/ssh/SshjSftp.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/ssh/SshjSftp.java @@ -25,7 +25,7 @@ import java.util.List; * *

    * 基于sshj 框架适配。
    - * 参考:https://github.com/hierynomus/sshj + * 参考:https://github.com/hierynomus/sshj *

    * * @author youyongkun @@ -102,7 +102,7 @@ public class SshjSftp extends AbstractFtp { this.ssh = new SSHClient(); ssh.addHostKeyVerifier(new PromiscuousVerifier()); try { - ssh.connect(ftpConfig.getHost()); + ssh.connect(ftpConfig.getHost(), ftpConfig.getPort()); ssh.authPassword(ftpConfig.getUser(), ftpConfig.getPassword()); ssh.setRemoteCharset(ftpConfig.getCharset()); this.sftp = ssh.newSFTPClient(); diff --git a/hutool-extra/src/test/java/cn/hutool/extra/mail/MailTest.java b/hutool-extra/src/test/java/cn/hutool/extra/mail/MailTest.java index 867de0512..caf30961b 100644 --- a/hutool-extra/src/test/java/cn/hutool/extra/mail/MailTest.java +++ b/hutool-extra/src/test/java/cn/hutool/extra/mail/MailTest.java @@ -74,7 +74,7 @@ public class MailTest { map.put("abc", FileUtil.getInputStream("D:/test/abc.png")); map.put("abcd",FileUtil.getInputStream("D:/test/def.png")); - MailUtil.sendHtml("loolly@aliyun.com", "测试", "

    邮件来自Hutool测试

    ", + MailUtil.sendHtml("hutool@foxmail.com", "测试", "

    邮件来自Hutool测试

    ", map); } } diff --git a/hutool-extra/src/test/java/cn/hutool/extra/qrcode/QrCodeUtilTest.java b/hutool-extra/src/test/java/cn/hutool/extra/qrcode/QrCodeUtilTest.java index 3bd0724db..142bff769 100755 --- a/hutool-extra/src/test/java/cn/hutool/extra/qrcode/QrCodeUtilTest.java +++ b/hutool-extra/src/test/java/cn/hutool/extra/qrcode/QrCodeUtilTest.java @@ -28,7 +28,7 @@ public class QrCodeUtilTest { } @Test -// @Ignore + @Ignore public void generateCustomTest() { final QrConfig config = new QrConfig(); config.setMargin(0); diff --git a/hutool-extra/src/test/resources/example/mail-example.setting b/hutool-extra/src/test/resources/example/mail-example.setting index 0138ec4f2..94784ec03 100644 --- a/hutool-extra/src/test/resources/example/mail-example.setting +++ b/hutool-extra/src/test/resources/example/mail-example.setting @@ -37,4 +37,6 @@ splitlongparameters = false # SMTP超时时长,单位毫秒,缺省值不超时 timeout = 0 # Socket连接超时值,单位毫秒,缺省值不超时 -connectionTimeout = 0 \ No newline at end of file +connectionTimeout = 0 +# Socket写出超时值,单位毫秒,缺省值不超时 +writeTimeout = 0 diff --git a/hutool-http/src/main/java/cn/hutool/http/HttpGlobalConfig.java b/hutool-http/src/main/java/cn/hutool/http/HttpGlobalConfig.java index e09df3dd8..026348596 100755 --- a/hutool-http/src/main/java/cn/hutool/http/HttpGlobalConfig.java +++ b/hutool-http/src/main/java/cn/hutool/http/HttpGlobalConfig.java @@ -10,6 +10,8 @@ import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.net.CookieManager; import java.net.HttpURLConnection; +import java.security.AccessController; +import java.security.PrivilegedAction; /** * HTTP 全局参数配置 @@ -181,6 +183,18 @@ public class HttpGlobalConfig implements Serializable { GlobalCookieManager.setCookieManager(null); } + /** + * 增加支持的METHOD方法
    + * 此方法通过注入方式修改{@link HttpURLConnection}中的methods静态属性,增加PATCH方法
    + * see: https://stackoverflow.com/questions/25163131/httpurlconnection-invalid-http-method-patch + */ + public static void allowPatch(){ + AccessController.doPrivileged((PrivilegedAction) () -> { + doAllowPatch(); + return null; + }); + } + /** * 增加支持的METHOD方法
    * 此方法通过注入方式修改{@link HttpURLConnection}中的methods静态属性,增加PATCH方法
    @@ -188,7 +202,7 @@ public class HttpGlobalConfig implements Serializable { * * @since 5.7.4 */ - synchronized public static void allowPatch() { + synchronized private static void doAllowPatch() { if (isAllowPatch) { return; } diff --git a/hutool-http/src/main/java/cn/hutool/http/HttpResponse.java b/hutool-http/src/main/java/cn/hutool/http/HttpResponse.java index 60ab142da..dbc319f90 100755 --- a/hutool-http/src/main/java/cn/hutool/http/HttpResponse.java +++ b/hutool-http/src/main/java/cn/hutool/http/HttpResponse.java @@ -128,7 +128,7 @@ public class HttpResponse extends HttpBase implements Closeable { *
  • Transfer-Encoding: Chunked
  • *
  • Content-Encoding: XXX
  • * - * 参考:https://blog.csdn.net/jiang7701037/article/details/86304302 + * 参考:https://blog.csdn.net/jiang7701037/article/details/86304302 * * @return 长度,-1表示服务端未返回或长度无效 * @since 5.7.9 @@ -309,7 +309,7 @@ public class HttpResponse extends HttpBase implements Closeable { * 将响应内容写出到文件-避免未完成的文件
    * 异步模式下直接读取Http流写出,同步模式下将存储在内存中的响应内容写出
    * 写出后会关闭Http流(异步模式)
    - * 来自:https://gitee.com/dromara/hutool/pulls/407
    + * 来自:https://gitee.com/dromara/hutool/pulls/407
    * 此方法原理是先在目标文件同级目录下创建临时文件,下载之,等下载完毕后重命名,避免因下载错误导致的文件不完整。 * * @param targetFileOrDir 写出到的文件或目录 @@ -507,7 +507,7 @@ public class HttpResponse extends HttpBase implements Closeable { } // 存储服务端设置的Cookie信息 - GlobalCookieManager.store(httpConnection); + GlobalCookieManager.store(httpConnection, this.headers); // 获取响应编码 final Charset charset = httpConnection.getCharset(); diff --git a/hutool-http/src/main/java/cn/hutool/http/cookie/GlobalCookieManager.java b/hutool-http/src/main/java/cn/hutool/http/cookie/GlobalCookieManager.java index b68032af1..5b406817c 100644 --- a/hutool-http/src/main/java/cn/hutool/http/cookie/GlobalCookieManager.java +++ b/hutool-http/src/main/java/cn/hutool/http/cookie/GlobalCookieManager.java @@ -1,6 +1,7 @@ package cn.hutool.http.cookie; import cn.hutool.core.io.IORuntimeException; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.net.URLUtil; import cn.hutool.http.HttpConnection; @@ -85,13 +86,24 @@ public class GlobalCookieManager { * @param conn {@link HttpConnection} */ public static void store(final HttpConnection conn) { - if(null == cookieManager) { - // 全局Cookie管理器关闭 + store(conn, conn.headers()); + } + + /** + * 存储响应的Cookie信息到本地
    + * 通过读取 + * + * @param conn {@link HttpConnection} + * @param responseHeaders 头信息Map + */ + public static void store(final HttpConnection conn, final Map> responseHeaders) { + if(null == cookieManager || MapUtil.isEmpty(responseHeaders)) { + // 全局Cookie管理器关闭或头信息为空 return; } try { - cookieManager.put(getURI(conn), conn.headers()); + cookieManager.put(getURI(conn), responseHeaders); } catch (final IOException e) { throw new IORuntimeException(e); } diff --git a/hutool-http/src/main/java/cn/hutool/http/server/action/RootAction.java b/hutool-http/src/main/java/cn/hutool/http/server/action/RootAction.java index b12fe9acc..ce1b31c9a 100644 --- a/hutool-http/src/main/java/cn/hutool/http/server/action/RootAction.java +++ b/hutool-http/src/main/java/cn/hutool/http/server/action/RootAction.java @@ -1,6 +1,6 @@ package cn.hutool.http.server.action; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.http.server.HttpServerRequest; import cn.hutool.http.server.HttpServerResponse; @@ -58,7 +58,7 @@ public class RootAction implements Action { */ public RootAction(final File rootDir, final String... indexFileNames) { this.rootDir = rootDir; - this.indexFileNames = CollUtil.toList(indexFileNames); + this.indexFileNames = ListUtil.of(indexFileNames); } @Override diff --git a/hutool-http/src/main/java/cn/hutool/http/useragent/Browser.java b/hutool-http/src/main/java/cn/hutool/http/useragent/Browser.java index d4f0f8265..2ef37ba85 100755 --- a/hutool-http/src/main/java/cn/hutool/http/useragent/Browser.java +++ b/hutool-http/src/main/java/cn/hutool/http/useragent/Browser.java @@ -1,6 +1,6 @@ package cn.hutool.http.useragent; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.regex.ReUtil; import java.util.List; @@ -27,7 +27,7 @@ public class Browser extends UserAgentInfo { /** * 支持的浏览器类型 */ - public static final List browers = CollUtil.newArrayList( + public static final List browers = ListUtil.of( // 部分特殊浏览器是基于安卓、Iphone等的,需要优先判断 // 企业微信 企业微信使用微信浏览器内核,会包含 MicroMessenger 所以要放在前面 new Browser("wxwork", "wxwork", "wxwork\\/([\\d\\w\\.\\-]+)"), diff --git a/hutool-http/src/main/java/cn/hutool/http/useragent/Engine.java b/hutool-http/src/main/java/cn/hutool/http/useragent/Engine.java index 3fde6e7f7..2317bd461 100755 --- a/hutool-http/src/main/java/cn/hutool/http/useragent/Engine.java +++ b/hutool-http/src/main/java/cn/hutool/http/useragent/Engine.java @@ -1,6 +1,6 @@ package cn.hutool.http.useragent; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.regex.ReUtil; import java.util.List; @@ -21,7 +21,7 @@ public class Engine extends UserAgentInfo { /** * 支持的引擎类型 */ - public static final List engines = CollUtil.newArrayList( + public static final List engines = ListUtil.view( new Engine("Trident", "trident"), new Engine("Webkit", "webkit"), new Engine("Chrome", "chrome"), diff --git a/hutool-http/src/main/java/cn/hutool/http/useragent/OS.java b/hutool-http/src/main/java/cn/hutool/http/useragent/OS.java index 23e1b50c7..34b260521 100755 --- a/hutool-http/src/main/java/cn/hutool/http/useragent/OS.java +++ b/hutool-http/src/main/java/cn/hutool/http/useragent/OS.java @@ -1,6 +1,6 @@ package cn.hutool.http.useragent; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.regex.ReUtil; import java.util.List; @@ -23,7 +23,7 @@ public class OS extends UserAgentInfo { /** * 支持的引擎类型 */ - public static final List oses = CollUtil.newArrayList(// + public static final List oses = ListUtil.view(// new OS("Windows 10 or Windows Server 2016", "windows nt 10\\.0", "windows nt (10\\.0)"),// new OS("Windows 8.1 or Windows Server 2012R2", "windows nt 6\\.3", "windows nt (6\\.3)"),// new OS("Windows 8 or Windows Server 2012", "windows nt 6\\.2", "windows nt (6\\.2)"),// diff --git a/hutool-http/src/main/java/cn/hutool/http/useragent/Platform.java b/hutool-http/src/main/java/cn/hutool/http/useragent/Platform.java index f4980470f..aaabcb420 100644 --- a/hutool-http/src/main/java/cn/hutool/http/useragent/Platform.java +++ b/hutool-http/src/main/java/cn/hutool/http/useragent/Platform.java @@ -1,6 +1,6 @@ package cn.hutool.http.useragent; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import java.util.ArrayList; import java.util.List; @@ -49,7 +49,7 @@ public class Platform extends UserAgentInfo { /** * 支持的移动平台类型 */ - public static final List mobilePlatforms = CollUtil.newArrayList(// + public static final List mobilePlatforms = ListUtil.view(// WINDOWS_PHONE, // IPAD, // IPOD, // @@ -65,7 +65,7 @@ public class Platform extends UserAgentInfo { /** * 支持的桌面平台类型 */ - public static final List desktopPlatforms = CollUtil.newArrayList(// + public static final List desktopPlatforms = ListUtil.view(// new Platform("Windows", "windows"), // new Platform("Mac", "(macintosh|darwin)"), // new Platform("Linux", "linux"), // diff --git a/hutool-http/src/test/java/cn/hutool/http/HttpRequestTest.java b/hutool-http/src/test/java/cn/hutool/http/HttpRequestTest.java index 109da1210..56de442b9 100644 --- a/hutool-http/src/test/java/cn/hutool/http/HttpRequestTest.java +++ b/hutool-http/src/test/java/cn/hutool/http/HttpRequestTest.java @@ -204,4 +204,11 @@ public class HttpRequestTest { final HttpRequest httpRequest = new HttpRequest(urlBuilder); httpRequest.setMethod(Method.GET).execute(); } + + @Test + @Ignore + public void getCookieTest(){ + final HttpResponse execute = HttpRequest.get("http://localhost:8888/getCookier").execute(); + Console.log(execute.getCookies()); + } } diff --git a/hutool-http/src/test/java/cn/hutool/http/server/SimpleServerTest.java b/hutool-http/src/test/java/cn/hutool/http/server/SimpleServerTest.java index 30998beca..9681e2ec2 100644 --- a/hutool-http/src/test/java/cn/hutool/http/server/SimpleServerTest.java +++ b/hutool-http/src/test/java/cn/hutool/http/server/SimpleServerTest.java @@ -1,12 +1,16 @@ package cn.hutool.http.server; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Console; import cn.hutool.core.net.multipart.UploadFile; import cn.hutool.http.ContentType; +import cn.hutool.http.Header; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONUtil; +import java.net.HttpCookie; + public class SimpleServerTest { public static void main(final String[] args) { @@ -54,7 +58,13 @@ public class SimpleServerTest { .addAction("test/zeroStr", (req, res)-> { res.write("0"); Console.log("Write 0 OK"); - }) + }).addAction("/getCookie", ((request, response) -> { + response.setHeader(Header.SET_COOKIE.toString(), + ListUtil.of( + new HttpCookie("cc", "123").toString(), + new HttpCookie("cc", "abc").toString())); + response.write("Cookie ok"); + })) .start(); } } diff --git a/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java b/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java index 2c96b479c..9978ac9fd 100755 --- a/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java +++ b/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java @@ -3,7 +3,7 @@ package cn.hutool.json; import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.func.Filter; -import cn.hutool.core.lang.mutable.MutablePair; +import cn.hutool.core.lang.mutable.MutableEntry; import cn.hutool.core.map.CaseInsensitiveLinkedMap; import cn.hutool.core.map.CaseInsensitiveTreeMap; import cn.hutool.core.util.ArrayUtil; @@ -140,7 +140,7 @@ public final class InternalJSONUtil { * @param value 值 * @return JSONObject */ - static JSONObject propertyPut(final JSONObject jsonObject, final Object key, final Object value, final Filter> filter) { + static JSONObject propertyPut(final JSONObject jsonObject, final Object key, final Object value, final Filter> filter) { final String[] path = StrUtil.splitToArray(Convert.toStr(key), CharUtil.DOT); final int last = path.length - 1; JSONObject target = jsonObject; diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONArray.java b/hutool-json/src/main/java/cn/hutool/json/JSONArray.java index b1724fbf9..8f19bf523 100755 --- a/hutool-json/src/main/java/cn/hutool/json/JSONArray.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONArray.java @@ -5,7 +5,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.func.Filter; import cn.hutool.core.lang.mutable.Mutable; import cn.hutool.core.lang.mutable.MutableObj; -import cn.hutool.core.lang.mutable.MutablePair; +import cn.hutool.core.lang.mutable.MutableEntry; import cn.hutool.core.text.StrJoiner; import cn.hutool.core.util.ObjUtil; import cn.hutool.json.serialize.JSONWriter; @@ -192,7 +192,7 @@ public class JSONArray implements JSON, JSONGetter, List, Rando @Override public Object getByPath(final String expression) { - return BeanPath.create(expression).get(this); + return BeanPath.of(expression).get(this); } @Override @@ -202,7 +202,7 @@ public class JSONArray implements JSON, JSONGetter, List, Rando @Override public void putByPath(final String expression, final Object value) { - BeanPath.create(expression).set(this, value); + BeanPath.of(expression).set(this, value); } /** @@ -416,10 +416,10 @@ public class JSONArray implements JSON, JSONGetter, List, Rando * @return 替换的值,即之前的值 * @since 5.8.0 */ - public Object set(final int index, Object element, final Filter> filter) { + public Object set(final int index, Object element, final Filter> filter) { // 添加前置过滤,通过MutablePair实现过滤、修改键值对等 if (null != filter) { - final MutablePair pair = new MutablePair<>(index, element); + final MutableEntry pair = new MutableEntry<>(index, element); if (filter.accept(pair)) { // 使用修改后的值 element = pair.getValue(); @@ -515,7 +515,7 @@ public class JSONArray implements JSON, JSONGetter, List, Rando * @return JSON字符串 * @since 5.7.15 */ - public String toJSONString(final int indentFactor, final Filter> filter) { + public String toJSONString(final int indentFactor, final Filter> filter) { final StringWriter sw = new StringWriter(); synchronized (sw.getBuffer()) { return this.write(sw, indentFactor, 0, filter).toString(); @@ -539,12 +539,12 @@ public class JSONArray implements JSON, JSONGetter, List, Rando * @throws JSONException JSON相关异常 * @since 5.7.15 */ - public Writer write(final Writer writer, final int indentFactor, final int indent, final Filter> filter) throws JSONException { + public Writer write(final Writer writer, final int indentFactor, final int indent, final Filter> filter) throws JSONException { final JSONWriter jsonWriter = JSONWriter.of(writer, indentFactor, indent, config) .beginArray(); CollUtil.forEach(this, (value, index) -> { - final MutablePair pair = new MutablePair<>(index, value); + final MutableEntry pair = new MutableEntry<>(index, value); if (null == filter || filter.accept(pair)) { jsonWriter.writeValue(pair.getValue()); } diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONConverter.java b/hutool-json/src/main/java/cn/hutool/json/JSONConverter.java index 9473cb1a7..126df29f3 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONConverter.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONConverter.java @@ -1,6 +1,7 @@ package cn.hutool.json; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.codec.Base64; import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.ConvertException; import cn.hutool.core.convert.Converter; @@ -85,6 +86,9 @@ public class JSONConverter implements Converter { } target.parse(value); return (T) target; + } else if(targetType == byte[].class && value instanceof CharSequence){ + // issue#I59LW4 + return (T) Base64.decode((CharSequence) value); } } diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONGetter.java b/hutool-json/src/main/java/cn/hutool/json/JSONGetter.java index fcc688524..981e2e6fc 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONGetter.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONGetter.java @@ -190,6 +190,16 @@ public interface JSONGetter extends OptNullBasicTypeFromObjectGetter { return Convert.toLocalDateTime(obj, defaultValue); } + /** + * 获取byte[]数据 + * + * @param key 键 + * @return 值 + */ + default byte[] getBytes(final K key) { + return get(key, byte[].class); + } + /** * 获取指定类型的对象
    * 转换失败或抛出异常 diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONObject.java b/hutool-json/src/main/java/cn/hutool/json/JSONObject.java index 0a668ca5e..c4521d0c7 100755 --- a/hutool-json/src/main/java/cn/hutool/json/JSONObject.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONObject.java @@ -3,7 +3,7 @@ package cn.hutool.json; import cn.hutool.core.bean.BeanPath; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.func.Filter; -import cn.hutool.core.lang.mutable.MutablePair; +import cn.hutool.core.lang.mutable.MutableEntry; import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapWrapper; import cn.hutool.core.util.ObjUtil; @@ -126,7 +126,7 @@ public class JSONObject extends MapWrapper implements JSON, JSON * @param filter 键值对过滤编辑器,可以通过实现此接口,完成解析前对键值对的过滤和修改操作,{@code null}表示不过滤 * @since 5.8.0 */ - public JSONObject(final Object source, final JSONConfig config, final Filter> filter) { + public JSONObject(final Object source, final JSONConfig config, final Filter> filter) { this(DEFAULT_CAPACITY, config); ObjectMapper.of(source).map(this, filter); } @@ -184,7 +184,7 @@ public class JSONObject extends MapWrapper implements JSON, JSON @Override public Object getByPath(final String expression) { - return BeanPath.create(expression).get(this); + return BeanPath.of(expression).get(this); } @Override @@ -194,7 +194,7 @@ public class JSONObject extends MapWrapper implements JSON, JSON @Override public void putByPath(final String expression, final Object value) { - BeanPath.create(expression).set(this, value); + BeanPath.of(expression).set(this, value); } /** @@ -233,7 +233,7 @@ public class JSONObject extends MapWrapper implements JSON, JSON * @throws JSONException 值是无穷数字抛出此异常 * @since 5.8.0 */ - public JSONObject set(final String key, final Object value, final Filter> filter, final boolean checkDuplicate) throws JSONException { + public JSONObject set(final String key, final Object value, final Filter> filter, final boolean checkDuplicate) throws JSONException { put(key, value, filter, checkDuplicate); return this; } @@ -260,7 +260,7 @@ public class JSONObject extends MapWrapper implements JSON, JSON * @throws JSONException 值是无穷数字、键重复抛出异常 * @since 5.8.0 */ - public JSONObject setOnce(final String key, final Object value, final Filter> filter) throws JSONException { + public JSONObject setOnce(final String key, final Object value, final Filter> filter) throws JSONException { return set(key, value, filter, true); } @@ -378,7 +378,7 @@ public class JSONObject extends MapWrapper implements JSON, JSON * @return JSON字符串 * @since 5.7.15 */ - public String toJSONString(final int indentFactor, final Filter> filter) { + public String toJSONString(final int indentFactor, final Filter> filter) { final StringWriter sw = new StringWriter(); synchronized (sw.getBuffer()) { return this.write(sw, indentFactor, 0, filter).toString(); @@ -402,12 +402,12 @@ public class JSONObject extends MapWrapper implements JSON, JSON * @throws JSONException JSON相关异常 * @since 5.7.15 */ - public Writer write(final Writer writer, final int indentFactor, final int indent, final Filter> filter) throws JSONException { + public Writer write(final Writer writer, final int indentFactor, final int indent, final Filter> filter) throws JSONException { final JSONWriter jsonWriter = JSONWriter.of(writer, indentFactor, indent, config) .beginObj(); this.forEach((key, value) -> { if (null != filter) { - final MutablePair pair = new MutablePair<>(key, value); + final MutableEntry pair = new MutableEntry<>(key, value); if (filter.accept(pair)) { // 使用修改后的键值对 jsonWriter.writeField(pair.getKey(), pair.getValue()); @@ -439,14 +439,14 @@ public class JSONObject extends MapWrapper implements JSON, JSON * @throws JSONException 值是无穷数字抛出此异常 * @since 5.8.0 */ - private Object put(String key, Object value, final Filter> filter, final boolean checkDuplicate) throws JSONException { + private Object put(String key, Object value, final Filter> filter, final boolean checkDuplicate) throws JSONException { if (null == key) { return this; } // 添加前置过滤,通过MutablePair实现过滤、修改键值对等 if (null != filter) { - final MutablePair pair = new MutablePair<>(key, value); + final MutableEntry pair = new MutableEntry<>(key, value); if (filter.accept(pair)) { // 使用修改后的键值对 key = pair.getKey(); diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONParser.java b/hutool-json/src/main/java/cn/hutool/json/JSONParser.java index 6120d76f2..f79c90c5e 100755 --- a/hutool-json/src/main/java/cn/hutool/json/JSONParser.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONParser.java @@ -2,7 +2,7 @@ package cn.hutool.json; import cn.hutool.core.lang.func.Filter; import cn.hutool.core.lang.mutable.Mutable; -import cn.hutool.core.lang.mutable.MutablePair; +import cn.hutool.core.lang.mutable.MutableEntry; /** * JSON字符串解析器 @@ -41,7 +41,7 @@ public class JSONParser { * @param jsonObject {@link JSONObject} * @param filter 键值对过滤编辑器,可以通过实现此接口,完成解析前对键值对的过滤和修改操作,{@code null}表示不过滤 */ - public void parseTo(final JSONObject jsonObject, final Filter> filter) { + public void parseTo(final JSONObject jsonObject, final Filter> filter) { final JSONTokener tokener = this.tokener; char c; diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java b/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java index b73c509f2..de0289c43 100755 --- a/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java @@ -1,15 +1,16 @@ package cn.hutool.json; +import cn.hutool.core.codec.Base64; +import cn.hutool.core.codec.HexUtil; import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.file.FileReader; -import cn.hutool.core.reflect.TypeReference; import cn.hutool.core.map.MapWrapper; -import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.reflect.ClassUtil; -import cn.hutool.core.codec.HexUtil; -import cn.hutool.core.util.ObjUtil; -import cn.hutool.core.text.StrUtil; +import cn.hutool.core.reflect.TypeReference; import cn.hutool.core.reflect.TypeUtil; +import cn.hutool.core.text.StrUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjUtil; import cn.hutool.json.serialize.GlobalSerializeMapping; import cn.hutool.json.serialize.JSONArraySerializer; import cn.hutool.json.serialize.JSONDeserializer; @@ -748,6 +749,12 @@ public class JSONUtil { // JSONArray if (object instanceof Iterable || ArrayUtil.isArray(object)) { + if(object instanceof byte[]){ + // issue#I59LW4 + // json内容中的bytes默认转为Base64 + return Base64.encode((byte[]) object); + } + return new JSONArray(object, jsonConfig); } // JSONObject diff --git a/hutool-json/src/main/java/cn/hutool/json/ObjectMapper.java b/hutool-json/src/main/java/cn/hutool/json/ObjectMapper.java index c9d3e556d..f012609fa 100755 --- a/hutool-json/src/main/java/cn/hutool/json/ObjectMapper.java +++ b/hutool-json/src/main/java/cn/hutool/json/ObjectMapper.java @@ -6,7 +6,7 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.io.IoUtil; import cn.hutool.core.lang.func.Filter; import cn.hutool.core.lang.mutable.Mutable; -import cn.hutool.core.lang.mutable.MutablePair; +import cn.hutool.core.lang.mutable.MutableEntry; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.text.StrUtil; import cn.hutool.core.reflect.TypeUtil; @@ -67,7 +67,7 @@ public class ObjectMapper { * @param filter 键值对过滤编辑器,可以通过实现此接口,完成解析前对键值对的过滤和修改操作 */ @SuppressWarnings({"rawtypes", "unchecked"}) - public void map(final JSONObject jsonObject, final Filter> filter) { + public void map(final JSONObject jsonObject, final Filter> filter) { final Object source = this.source; if (null == source) { return; @@ -144,6 +144,7 @@ public class ObjectMapper { } else if (source instanceof InputStream) { mapFromTokener(new JSONTokener((InputStream) source, jsonArray.getConfig()), jsonArray, filter); } else if (source instanceof byte[]) { + // bytes按照JSON的二进制流对待 mapFromTokener(new JSONTokener(IoUtil.toStream((byte[]) source), jsonArray.getConfig()), jsonArray, filter); } else if (source instanceof JSONTokener) { mapFromTokener((JSONTokener) source, jsonArray, filter); @@ -179,7 +180,7 @@ public class ObjectMapper { * @param filter 键值对过滤编辑器,可以通过实现此接口,完成解析前对键值对的过滤和修改操作,{@code null}表示不过滤 * @since 5.3.1 */ - private static void mapFromResourceBundle(final ResourceBundle bundle, final JSONObject jsonObject, final Filter> filter) { + private static void mapFromResourceBundle(final ResourceBundle bundle, final JSONObject jsonObject, final Filter> filter) { final Enumeration keys = bundle.getKeys(); while (keys.hasMoreElements()) { final String key = keys.nextElement(); @@ -196,7 +197,7 @@ public class ObjectMapper { * @param jsonObject {@link JSONObject} * @param filter 键值对过滤编辑器,可以通过实现此接口,完成解析前对键值对的过滤和修改操作,{@code null}表示不过滤 */ - private static void mapFromStr(final CharSequence source, final JSONObject jsonObject, final Filter> filter) { + private static void mapFromStr(final CharSequence source, final JSONObject jsonObject, final Filter> filter) { final String jsonStr = StrUtil.trim(source); if (StrUtil.startWith(jsonStr, '<')) { // 可能为XML @@ -226,7 +227,7 @@ public class ObjectMapper { * @param jsonObject {@link JSONObject} * @param filter 键值对过滤编辑器,可以通过实现此接口,完成解析前对键值对的过滤和修改操作 */ - private static void mapFromTokener(final JSONTokener x, final JSONObject jsonObject, final Filter> filter) { + private static void mapFromTokener(final JSONTokener x, final JSONObject jsonObject, final Filter> filter) { JSONParser.of(x).parseTo(jsonObject, filter); } diff --git a/hutool-json/src/main/java/cn/hutool/json/jwt/JWTValidator.java b/hutool-json/src/main/java/cn/hutool/json/jwt/JWTValidator.java index 24598728a..79e3a361a 100755 --- a/hutool-json/src/main/java/cn/hutool/json/jwt/JWTValidator.java +++ b/hutool-json/src/main/java/cn/hutool/json/jwt/JWTValidator.java @@ -218,11 +218,13 @@ public class JWTValidator { * @param leeway 容忍空间,单位:秒。向后容忍 * @throws ValidateException 验证异常 */ - private static void validateNotAfter(final String fieldName, final Date dateToCheck, final Date now, final long leeway) throws ValidateException { + private static void validateNotAfter(final String fieldName, final Date dateToCheck, Date now, final long leeway) throws ValidateException { if (null == dateToCheck) { return; } - now.setTime(now.getTime() + leeway * 1000); + if(leeway > 0){ + now = DateUtil.date(now.getTime() + leeway * 1000); + } if (dateToCheck.after(now)) { throw new ValidateException("'{}':[{}] is after now:[{}]", fieldName, DateUtil.date(dateToCheck), DateUtil.date(now)); @@ -240,11 +242,13 @@ public class JWTValidator { * @throws ValidateException 验证异常 */ @SuppressWarnings("SameParameterValue") - private static void validateNotBefore(final String fieldName, final Date dateToCheck, final Date now, final long leeway) throws ValidateException { + private static void validateNotBefore(final String fieldName, final Date dateToCheck, Date now, final long leeway) throws ValidateException { if (null == dateToCheck) { return; } - now.setTime(now.getTime() - leeway * 1000); + if(leeway > 0){ + now = DateUtil.date(now.getTime() - leeway * 1000); + } if (dateToCheck.before(now)) { throw new ValidateException("'{}':[{}] is before now:[{}]", fieldName, DateUtil.date(dateToCheck), DateUtil.date(now)); diff --git a/hutool-json/src/main/java/cn/hutool/json/serialize/JSONWriter.java b/hutool-json/src/main/java/cn/hutool/json/serialize/JSONWriter.java index 6a1c0e592..9fde0e255 100755 --- a/hutool-json/src/main/java/cn/hutool/json/serialize/JSONWriter.java +++ b/hutool-json/src/main/java/cn/hutool/json/serialize/JSONWriter.java @@ -1,14 +1,15 @@ package cn.hutool.json.serialize; +import cn.hutool.core.codec.Base64; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.TemporalAccessorUtil; import cn.hutool.core.date.format.GlobalCustomFormat; import cn.hutool.core.io.IORuntimeException; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.CharUtil; import cn.hutool.core.math.NumberUtil; import cn.hutool.core.text.StrUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.CharUtil; import cn.hutool.json.JSON; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONConfig; @@ -226,7 +227,13 @@ public class JSONWriter extends Writer { } else if (value instanceof Map || value instanceof Map.Entry) { new JSONObject(value).write(writer, indentFactor, indent); } else if (value instanceof Iterable || value instanceof Iterator || ArrayUtil.isArray(value)) { - new JSONArray(value).write(writer, indentFactor, indent); + if(value instanceof byte[]){ + // issue#I59LW4 + // json内容中的bytes默认转为Base64 + writeStrValue(Base64.encode((byte[]) value)); + }else{ + new JSONArray(value).write(writer, indentFactor, indent); + } } else if (value instanceof Number) { writeNumberValue((Number) value); } else if (value instanceof Date || value instanceof Calendar || value instanceof TemporalAccessor) { diff --git a/hutool-json/src/test/java/cn/hutool/json/Issue2131Test.java b/hutool-json/src/test/java/cn/hutool/json/Issue2131Test.java index 3afb2064a..437621b7c 100755 --- a/hutool-json/src/test/java/cn/hutool/json/Issue2131Test.java +++ b/hutool-json/src/test/java/cn/hutool/json/Issue2131Test.java @@ -49,7 +49,7 @@ public class Issue2131Test { @Data static class GoodsResponse extends BaseResponse { // 由于定义成了final形式,setXXX无效,导致无法注入。 - private final List collections = ListUtil.list(false); + private final List collections = ListUtil.of(false); } @Data diff --git a/hutool-json/src/test/java/cn/hutool/json/IssueI1AU86Test.java b/hutool-json/src/test/java/cn/hutool/json/IssueI1AU86Test.java index c9a2a3e57..922e40b2e 100644 --- a/hutool-json/src/test/java/cn/hutool/json/IssueI1AU86Test.java +++ b/hutool-json/src/test/java/cn/hutool/json/IssueI1AU86Test.java @@ -1,6 +1,6 @@ package cn.hutool.json; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import lombok.Data; import org.junit.Assert; import org.junit.Test; @@ -19,7 +19,7 @@ public class IssueI1AU86Test { @Test public void toListTest() { - final List redisList = CollUtil.newArrayList( + final List redisList = ListUtil.of( "{\"updateDate\":1583376342000,\"code\":\"move\",\"id\":1,\"sort\":1,\"name\":\"电影大全\"}", "{\"updateDate\":1583378882000,\"code\":\"zy\",\"id\":3,\"sort\":5,\"name\":\"综艺会\"}" ); diff --git a/hutool-json/src/test/java/cn/hutool/json/IssueI59LW4Test.java b/hutool-json/src/test/java/cn/hutool/json/IssueI59LW4Test.java new file mode 100644 index 000000000..60d864984 --- /dev/null +++ b/hutool-json/src/test/java/cn/hutool/json/IssueI59LW4Test.java @@ -0,0 +1,24 @@ +package cn.hutool.json; + +import org.junit.Assert; +import org.junit.Test; + +public class IssueI59LW4Test { + @Test + public void bytesTest(){ + final JSONObject jsonObject = JSONUtil.createObj().set("bytes", new byte[]{1}); + Assert.assertEquals("{\"bytes\":\"AQ==\"}", jsonObject.toString()); + + final byte[] bytes = jsonObject.getBytes("bytes"); + Assert.assertArrayEquals(new byte[]{1}, bytes); + } + + @Test + public void bytesInJSONArrayTest(){ + final JSONArray jsonArray = JSONUtil.createArray().set(new byte[]{1}); + Assert.assertEquals("[\"AQ==\"]", jsonArray.toString()); + + final byte[] bytes = jsonArray.getBytes(0); + Assert.assertArrayEquals(new byte[]{1}, bytes); + } +} diff --git a/hutool-json/src/test/java/cn/hutool/json/JSONArrayTest.java b/hutool-json/src/test/java/cn/hutool/json/JSONArrayTest.java index e5700c150..e56fe9517 100755 --- a/hutool-json/src/test/java/cn/hutool/json/JSONArrayTest.java +++ b/hutool-json/src/test/java/cn/hutool/json/JSONArrayTest.java @@ -1,6 +1,5 @@ package cn.hutool.json; -import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.convert.ConvertException; import cn.hutool.core.io.FileUtil; @@ -43,7 +42,7 @@ public class JSONArrayTest { @Test public void addNullTest(){ - final List aaa = ListUtil.of("aaa", null); + final List aaa = ListUtil.view("aaa", null); final String jsonStr = JSONUtil.toJsonStr(JSONUtil.parse(aaa, JSONConfig.create().setIgnoreNullValue(false))); Assert.assertEquals("[\"aaa\",null]", jsonStr); @@ -98,7 +97,7 @@ public class JSONArrayTest { b2.setAkey("aValue2"); b2.setBkey("bValue2"); - final ArrayList list = CollUtil.newArrayList(b1, b2); + final ArrayList list = ListUtil.of(b1, b2); final JSONArray jsonArray = JSONUtil.parseArray(list); Assert.assertEquals("aValue1", jsonArray.getJSONObject(0).getStr("akey")); diff --git a/hutool-json/src/test/java/cn/hutool/json/JSONObjectTest.java b/hutool-json/src/test/java/cn/hutool/json/JSONObjectTest.java index 48f074762..b33f4cd2a 100755 --- a/hutool-json/src/test/java/cn/hutool/json/JSONObjectTest.java +++ b/hutool-json/src/test/java/cn/hutool/json/JSONObjectTest.java @@ -2,7 +2,7 @@ package cn.hutool.json; import cn.hutool.core.annotation.Alias; import cn.hutool.core.annotation.PropIgnore; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; @@ -238,7 +238,7 @@ public class JSONObjectTest { userA.setA("A user"); userA.setName("{\n\t\"body\":{\n\t\t\"loginId\":\"id\",\n\t\t\"password\":\"pwd\"\n\t}\n}"); userA.setDate(new Date()); - userA.setSqs(CollUtil.newArrayList(new Seq("seq1"), new Seq("seq2"))); + userA.setSqs(ListUtil.of(new Seq("seq1"), new Seq("seq2"))); final JSONObject json = JSONUtil.parseObj(userA); final UserA userA2 = json.toBean(UserA.class); @@ -320,7 +320,7 @@ public class JSONObjectTest { final UserA userA = new UserA(); userA.setName("nameTest"); userA.setDate(new Date()); - userA.setSqs(CollUtil.newArrayList(new Seq(null), new Seq("seq2"))); + userA.setSqs(ListUtil.of(new Seq(null), new Seq("seq2"))); final JSONObject json = JSONUtil.parseObj(userA, false); @@ -333,7 +333,7 @@ public class JSONObjectTest { final TestBean bean = new TestBean(); bean.setDoubleValue(111.1); bean.setIntValue(123); - bean.setList(CollUtil.newArrayList("a", "b", "c")); + bean.setList(ListUtil.of("a", "b", "c")); bean.setStrValue("strTest"); bean.setTestEnum(TestEnum.TYPE_B); @@ -565,7 +565,7 @@ public class JSONObjectTest { * * @author Looly */ - @SuppressWarnings("FieldCanBeLocal") + @SuppressWarnings({"FieldCanBeLocal", "FieldMayBeStatic"}) public static class SameNameBean { private final String username = "123"; private final String userName = "abc"; diff --git a/hutool-json/src/test/java/cn/hutool/json/JSONUtilTest.java b/hutool-json/src/test/java/cn/hutool/json/JSONUtilTest.java index 56d64b38d..a79a4bffe 100644 --- a/hutool-json/src/test/java/cn/hutool/json/JSONUtilTest.java +++ b/hutool-json/src/test/java/cn/hutool/json/JSONUtilTest.java @@ -1,6 +1,5 @@ package cn.hutool.json; -import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Console; @@ -59,7 +58,7 @@ public class JSONUtilTest { a2.setDate(DateUtil.date()); a2.setName("AAAA222Name"); - final ArrayList list = CollUtil.newArrayList(a1, a2); + final ArrayList list = ListUtil.of(a1, a2); final HashMap map = MapUtil.newHashMap(); map.put("total", 13); map.put("rows", list); @@ -230,7 +229,7 @@ public class JSONUtilTest { public void toXmlTest(){ final JSONObject obj = JSONUtil.createObj(); obj.set("key1", "v1") - .set("key2", ListUtil.of("a", "b", "c")); + .set("key2", ListUtil.view("a", "b", "c")); final String xmlStr = JSONUtil.toXmlStr(obj); Assert.assertEquals("v1abc", xmlStr); } diff --git a/hutool-json/src/test/java/cn/hutool/json/ParseBeanTest.java b/hutool-json/src/test/java/cn/hutool/json/ParseBeanTest.java index 4b32997d1..f9c3cd578 100644 --- a/hutool-json/src/test/java/cn/hutool/json/ParseBeanTest.java +++ b/hutool-json/src/test/java/cn/hutool/json/ParseBeanTest.java @@ -1,6 +1,6 @@ package cn.hutool.json; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import org.junit.Assert; import org.junit.Test; @@ -24,12 +24,12 @@ public class ParseBeanTest { c2.setTest("test2"); final B b1 = new B(); - b1.setCs(CollUtil.newArrayList(c1, c2)); + b1.setCs(ListUtil.of(c1, c2)); final B b2 = new B(); - b2.setCs(CollUtil.newArrayList(c1, c2)); + b2.setCs(ListUtil.of(c1, c2)); final A a = new A(); - a.setBs(CollUtil.newArrayList(b1, b2)); + a.setBs(ListUtil.of(b1, b2)); final JSONObject json = JSONUtil.parseObj(a); final A a1 = JSONUtil.toBean(json, A.class); diff --git a/hutool-json/src/test/java/cn/hutool/json/jwt/JWTValidatorTest.java b/hutool-json/src/test/java/cn/hutool/json/jwt/JWTValidatorTest.java index d8bd91e83..1dc59d3a5 100755 --- a/hutool-json/src/test/java/cn/hutool/json/jwt/JWTValidatorTest.java +++ b/hutool-json/src/test/java/cn/hutool/json/jwt/JWTValidatorTest.java @@ -6,6 +6,8 @@ import cn.hutool.json.jwt.signers.JWTSignerUtil; import org.junit.Assert; import org.junit.Test; +import java.util.Date; + public class JWTValidatorTest { @Test(expected = ValidateException.class) @@ -79,4 +81,20 @@ public class JWTValidatorTest { JWTValidator.of(jwt).validateDate(DateUtil.date()); } + + @Test + public void issue2329Test(){ + final long now = System.currentTimeMillis(); + final Date nowTime = new Date(now); + final long expired = 3 * 1000L; + final Date expiredTime = new Date(now + expired); + + // 使用这种方式生成token + final String token = JWT.create().setPayload("sub", "blue-light").setIssuedAt(nowTime).setNotBefore(expiredTime) + .setExpiresAt(expiredTime).setKey("123456".getBytes()).sign(); + + // 使用这种方式验证token + JWTValidator.of(JWT.of(token)).validateDate(DateUtil.date(now - 4000), 10); + JWTValidator.of(JWT.of(token)).validateDate(DateUtil.date(now + 4000), 10); + } } diff --git a/hutool-poi/src/main/java/cn/hutool/poi/csv/CsvRow.java b/hutool-poi/src/main/java/cn/hutool/poi/csv/CsvRow.java index 71e29bd17..c6a48a0f2 100755 --- a/hutool-poi/src/main/java/cn/hutool/poi/csv/CsvRow.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/csv/CsvRow.java @@ -1,6 +1,7 @@ package cn.hutool.poi.csv; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.lang.Assert; import java.util.Collection; @@ -98,7 +99,7 @@ public final class CsvRow implements List { } /** - * 一行数据转换为Bean对象 + * 一行数据转换为Bean对象,忽略转换错误 * * @param Bean类型 * @param clazz bean类 @@ -106,7 +107,7 @@ public final class CsvRow implements List { * @since 5.3.6 */ public T toBean(final Class clazz){ - return BeanUtil.toBeanIgnoreError(getFieldMap(), clazz); + return BeanUtil.toBean(getFieldMap(), clazz, CopyOptions.create().setIgnoreError(true)); } /** diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelWriter.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelWriter.java index d3ad06d39..57b4f6d42 100755 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelWriter.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelWriter.java @@ -1,7 +1,7 @@ package cn.hutool.poi.excel; import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.comparator.IndexedComparator; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IORuntimeException; @@ -13,8 +13,8 @@ import cn.hutool.core.map.TableMap; import cn.hutool.core.map.multi.RowKeyTable; import cn.hutool.core.map.multi.Table; import cn.hutool.core.net.URLEncoder; -import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.text.StrUtil; +import cn.hutool.core.util.CharsetUtil; import cn.hutool.poi.excel.cell.CellLocation; import cn.hutool.poi.excel.cell.CellUtil; import cn.hutool.poi.excel.style.Align; @@ -1017,7 +1017,7 @@ public class ExcelWriter extends ExcelBase { } } else if (rowBean instanceof Hyperlink) { // Hyperlink当成一个值 - return writeRow(CollUtil.newArrayList(rowBean), isWriteKeyAsHead); + return writeRow(ListUtil.of(rowBean), isWriteKeyAsHead); } else if (BeanUtil.isBean(rowBean.getClass())) { if (MapUtil.isEmpty(this.headerAlias)) { rowMap = BeanUtil.beanToMap(rowBean, new LinkedHashMap<>(), false, false); @@ -1027,7 +1027,7 @@ public class ExcelWriter extends ExcelBase { } } else { // 其它转为字符串默认输出 - return writeRow(CollUtil.newArrayList(rowBean), isWriteKeyAsHead); + return writeRow(ListUtil.of(rowBean), isWriteKeyAsHead); } return writeRow(rowMap, isWriteKeyAsHead); } diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/SheetRidReader.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/SheetRidReader.java index 14f5a00d7..23fb8e29d 100644 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/SheetRidReader.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/SheetRidReader.java @@ -157,7 +157,7 @@ public class SheetRidReader extends DefaultHandler { * @since 5.7.17 */ public List getSheetNames() { - return ListUtil.toList(this.NAME_RID_MAP.keySet()); + return ListUtil.of(this.NAME_RID_MAP.keySet()); } @Override diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/handler/BeanRowHandler.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/handler/BeanRowHandler.java index d20abcca7..8ea6cd955 100644 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/handler/BeanRowHandler.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/handler/BeanRowHandler.java @@ -44,7 +44,7 @@ public abstract class BeanRowHandler extends AbstractRowHandler { @Override public void handle(final int sheetIndex, final long rowIndex, final List rowCells) { if (rowIndex == this.headerRowIndex) { - this.headerList = ListUtil.unmodifiable(Convert.toList(String.class, rowCells)); + this.headerList = ListUtil.view(Convert.toList(String.class, rowCells)); return; } super.handle(sheetIndex, rowIndex, rowCells); diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/handler/MapRowHandler.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/handler/MapRowHandler.java index 8e0aa08a8..36c5ba9fe 100644 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/handler/MapRowHandler.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/handler/MapRowHandler.java @@ -41,7 +41,7 @@ public abstract class MapRowHandler extends AbstractRowHandler rowCells) { if (rowIndex == this.headerRowIndex) { - this.headerList = ListUtil.unmodifiable(Convert.toList(String.class, rowCells)); + this.headerList = ListUtil.view(Convert.toList(String.class, rowCells)); return; } super.handle(sheetIndex, rowIndex, rowCells); diff --git a/hutool-poi/src/main/java/cn/hutool/poi/word/TableUtil.java b/hutool-poi/src/main/java/cn/hutool/poi/word/TableUtil.java index 760f1c9b1..6b281060b 100755 --- a/hutool-poi/src/main/java/cn/hutool/poi/word/TableUtil.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/word/TableUtil.java @@ -1,7 +1,7 @@ package cn.hutool.poi.word; import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.collection.iter.IterUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.Assert; @@ -94,7 +94,7 @@ public class TableUtil { rowMap = BeanUtil.beanToMap(rowBean, new LinkedHashMap<>(), false, false); } else { // 其它转为字符串默认输出 - writeRow(row, CollUtil.newArrayList(rowBean), isWriteKeyAsHead); + writeRow(row, ListUtil.of(rowBean), isWriteKeyAsHead); return; } diff --git a/hutool-poi/src/test/java/cn/hutool/poi/csv/CsvReaderTest.java b/hutool-poi/src/test/java/cn/hutool/poi/csv/CsvReaderTest.java index e826fb333..4e9c19931 100755 --- a/hutool-poi/src/test/java/cn/hutool/poi/csv/CsvReaderTest.java +++ b/hutool-poi/src/test/java/cn/hutool/poi/csv/CsvReaderTest.java @@ -202,4 +202,14 @@ public class CsvReaderTest { final CsvReader reader = CsvUtil.getReader(ResourceUtil.getUtf8Reader("test_bean.csv")); reader.stream().limit(2).forEach(Console::log); } + + @Test + @Ignore + public void issue2306Test(){ + final CsvReader reader = CsvUtil.getReader(ResourceUtil.getUtf8Reader("d:/test/issue2306.csv")); + final CsvData csvData = reader.read(); + for (CsvRow csvRow : csvData) { + Console.log(csvRow); + } + } } diff --git a/hutool-poi/src/test/java/cn/hutool/poi/csv/CsvUtilTest.java b/hutool-poi/src/test/java/cn/hutool/poi/csv/CsvUtilTest.java index eba767523..cd929bb8e 100755 --- a/hutool-poi/src/test/java/cn/hutool/poi/csv/CsvUtilTest.java +++ b/hutool-poi/src/test/java/cn/hutool/poi/csv/CsvUtilTest.java @@ -177,7 +177,7 @@ public class CsvUtilTest { String mobile; } - final List header = ListUtil.of("用户id", "用户名", "手机号"); + final List header = ListUtil.view("用户id", "用户名", "手机号"); final List row = new ArrayList<>(); final List datas = new ArrayList<>(); diff --git a/hutool-poi/src/test/java/cn/hutool/poi/excel/BigExcelWriteTest.java b/hutool-poi/src/test/java/cn/hutool/poi/excel/BigExcelWriteTest.java index 1b3216aab..ddd4f46f0 100644 --- a/hutool-poi/src/test/java/cn/hutool/poi/excel/BigExcelWriteTest.java +++ b/hutool-poi/src/test/java/cn/hutool/poi/excel/BigExcelWriteTest.java @@ -1,6 +1,6 @@ package cn.hutool.poi.excel; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.map.MapUtil; @@ -30,7 +30,7 @@ public class BigExcelWriteTest { @Test @Ignore public void writeTest2() { - final List row = CollUtil.newArrayList("姓名", "加班日期", "下班时间", "加班时长", "餐补", "车补次数", "车补", "总计"); + final List row = ListUtil.of("姓名", "加班日期", "下班时间", "加班时长", "餐补", "车补次数", "车补", "总计"); final BigExcelWriter overtimeWriter = ExcelUtil.getBigWriter("e:/excel/single_line.xlsx"); overtimeWriter.write(row); overtimeWriter.close(); @@ -39,13 +39,13 @@ public class BigExcelWriteTest { @Test @Ignore public void writeTest() { - final List row1 = CollUtil.newArrayList("aaaaa", "bb", "cc", "dd", DateUtil.date(), 3.22676575765); - final List row2 = CollUtil.newArrayList("aa1", "bb1", "cc1", "dd1", DateUtil.date(), 250.7676); - final List row3 = CollUtil.newArrayList("aa2", "bb2", "cc2", "dd2", DateUtil.date(), 0.111); - final List row4 = CollUtil.newArrayList("aa3", "bb3", "cc3", "dd3", DateUtil.date(), 35); - final List row5 = CollUtil.newArrayList("aa4", "bb4", "cc4", "dd4", DateUtil.date(), 28.00); + final List row1 = ListUtil.of("aaaaa", "bb", "cc", "dd", DateUtil.date(), 3.22676575765); + final List row2 = ListUtil.of("aa1", "bb1", "cc1", "dd1", DateUtil.date(), 250.7676); + final List row3 = ListUtil.of("aa2", "bb2", "cc2", "dd2", DateUtil.date(), 0.111); + final List row4 = ListUtil.of("aa3", "bb3", "cc3", "dd3", DateUtil.date(), 35); + final List row5 = ListUtil.of("aa4", "bb4", "cc4", "dd4", DateUtil.date(), 28.00); - final List> rows = CollUtil.newArrayList(row1, row2, row3, row4, row5); + final List> rows = ListUtil.of(row1, row2, row3, row4, row5); for(int i=0; i < 400000; i++) { //超大列表写出测试 rows.add(ObjUtil.clone(row1)); @@ -70,13 +70,13 @@ public class BigExcelWriteTest { @Test @Ignore public void mergeTest() { - final List row1 = CollUtil.newArrayList("aa", "bb", "cc", "dd", DateUtil.date(), 3.22676575765); - final List row2 = CollUtil.newArrayList("aa1", "bb1", "cc1", "dd1", DateUtil.date(), 250.7676); - final List row3 = CollUtil.newArrayList("aa2", "bb2", "cc2", "dd2", DateUtil.date(), 0.111); - final List row4 = CollUtil.newArrayList("aa3", "bb3", "cc3", "dd3", DateUtil.date(), 35); - final List row5 = CollUtil.newArrayList("aa4", "bb4", "cc4", "dd4", DateUtil.date(), 28.00); + final List row1 = ListUtil.of("aa", "bb", "cc", "dd", DateUtil.date(), 3.22676575765); + final List row2 = ListUtil.of("aa1", "bb1", "cc1", "dd1", DateUtil.date(), 250.7676); + final List row3 = ListUtil.of("aa2", "bb2", "cc2", "dd2", DateUtil.date(), 0.111); + final List row4 = ListUtil.of("aa3", "bb3", "cc3", "dd3", DateUtil.date(), 35); + final List row5 = ListUtil.of("aa4", "bb4", "cc4", "dd4", DateUtil.date(), 28.00); - final List> rows = CollUtil.newArrayList(row1, row2, row3, row4, row5); + final List> rows = ListUtil.of(row1, row2, row3, row4, row5); // 通过工具类创建writer final BigExcelWriter writer = ExcelUtil.getBigWriter("e:/mergeTest.xlsx"); @@ -114,7 +114,7 @@ public class BigExcelWriteTest { row2.put("是否合格", false); row2.put("考试日期", DateUtil.date()); - final ArrayList> rows = CollUtil.newArrayList(row1, row2); + final ArrayList> rows = ListUtil.of(row1, row2); // 通过工具类创建writer final String path = "e:/bigWriteMapTest.xlsx"; @@ -174,7 +174,7 @@ public class BigExcelWriteTest { bean2.setScore(38.50); bean2.setExamDate(DateUtil.date()); - final List rows = CollUtil.newArrayList(bean1, bean2); + final List rows = ListUtil.of(bean1, bean2); // 通过工具类创建writer final String file = "e:/bigWriteBeanTest.xlsx"; FileUtil.del(file); diff --git a/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelWriteTest.java b/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelWriteTest.java index 1f6c718a0..faa12dd0d 100755 --- a/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelWriteTest.java +++ b/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelWriteTest.java @@ -1,13 +1,12 @@ package cn.hutool.poi.excel; -import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Console; +import cn.hutool.core.lang.id.IdUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.CharsetUtil; -import cn.hutool.core.lang.id.IdUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.poi.excel.cell.setters.EscapeStrCellSetter; import cn.hutool.poi.excel.style.StyleUtil; @@ -47,12 +46,12 @@ public class ExcelWriteTest { @Test public void writeNoFlushTest(){ - final List row1 = CollUtil.newArrayList("aaaaa", "bb", "cc", "dd", DateUtil.date(), 3.22676575765); - final List row2 = CollUtil.newArrayList("aa1", "bb1", "cc1", "dd1", DateUtil.date(), 250.7676); - final List row3 = CollUtil.newArrayList("aa2", "bb2", "cc2", "dd2", DateUtil.date(), 0.111); - final List row4 = CollUtil.newArrayList("aa3", "bb3", "cc3", "dd3", DateUtil.date(), 35); - final List row5 = CollUtil.newArrayList("aa4", "bb4", "cc4", "dd4", DateUtil.date(), 28.00); - final List> rows = CollUtil.newArrayList(row1, row2, row3, row4, row5); + final List row1 = ListUtil.of("aaaaa", "bb", "cc", "dd", DateUtil.date(), 3.22676575765); + final List row2 = ListUtil.of("aa1", "bb1", "cc1", "dd1", DateUtil.date(), 250.7676); + final List row3 = ListUtil.of("aa2", "bb2", "cc2", "dd2", DateUtil.date(), 0.111); + final List row4 = ListUtil.of("aa3", "bb3", "cc3", "dd3", DateUtil.date(), 35); + final List row5 = ListUtil.of("aa4", "bb4", "cc4", "dd4", DateUtil.date(), 28.00); + final List> rows = ListUtil.of(row1, row2, row3, row4, row5); final ExcelWriter writer = ExcelUtil.getWriter(); writer.write(rows); @@ -62,13 +61,13 @@ public class ExcelWriteTest { @Test @Ignore public void testRowOrColumnCellStyle() { - final List row1 = CollUtil.newArrayList("aaaaa", "bb", "cc", "dd", DateUtil.date(), 3.22676575765); - final List row2 = CollUtil.newArrayList("aa1", "bb1", "cc1", "dd1", DateUtil.date(), 250.7676); - final List row3 = CollUtil.newArrayList("aa2", "bb2", "cc2", "dd2", DateUtil.date(), 0.111); - final List row4 = CollUtil.newArrayList("aa3", "bb3", "cc3", "dd3", DateUtil.date(), 35); - final List row5 = CollUtil.newArrayList("aa4", "bb4", "cc4", "dd4", DateUtil.date(), 28.00); + final List row1 = ListUtil.of("aaaaa", "bb", "cc", "dd", DateUtil.date(), 3.22676575765); + final List row2 = ListUtil.of("aa1", "bb1", "cc1", "dd1", DateUtil.date(), 250.7676); + final List row3 = ListUtil.of("aa2", "bb2", "cc2", "dd2", DateUtil.date(), 0.111); + final List row4 = ListUtil.of("aa3", "bb3", "cc3", "dd3", DateUtil.date(), 35); + final List row5 = ListUtil.of("aa4", "bb4", "cc4", "dd4", DateUtil.date(), 28.00); - final List> rows = CollUtil.newArrayList(row1, row2, row3, row4, row5); + final List> rows = ListUtil.of(row1, row2, row3, row4, row5); final BigExcelWriter overtimeWriter = ExcelUtil.getBigWriter("d:/test/style_line.xlsx"); overtimeWriter.write(rows, true); @@ -106,7 +105,7 @@ public class ExcelWriteTest { @Test @Ignore public void writeTest2() { - final List row = CollUtil.newArrayList("姓名", "加班日期", "下班时间", "加班时长", "餐补", "车补次数", "车补", "总计"); + final List row = ListUtil.of("姓名", "加班日期", "下班时间", "加班时长", "餐补", "车补次数", "车补", "总计"); final ExcelWriter overtimeWriter = ExcelUtil.getWriter("e:/excel/single_line.xlsx"); overtimeWriter.writeRow(row); overtimeWriter.close(); @@ -118,12 +117,12 @@ public class ExcelWriteTest { final ExcelWriter writer = ExcelUtil.getWriterWithSheet("表格1"); // 写出第一张表 - final List row = CollUtil.newArrayList("姓名", "加班日期", "下班时间", "加班时长", "餐补", "车补次数", "车补", "总计"); + final List row = ListUtil.of("姓名", "加班日期", "下班时间", "加班时长", "餐补", "车补次数", "车补", "总计"); writer.writeRow(row); // 写出第二张表 writer.setSheet("表格2"); - final List row2 = CollUtil.newArrayList("姓名2", "加班日期2", "下班时间2", "加班时长2", "餐补2", "车补次数2", "车补2", "总计2"); + final List row2 = ListUtil.of("姓名2", "加班日期2", "下班时间2", "加班时长2", "餐补2", "车补次数2", "车补2", "总计2"); writer.writeRow(row2); // 生成文件或导出Excel @@ -135,13 +134,13 @@ public class ExcelWriteTest { @Test @Ignore public void writeTest() { - final List row1 = CollUtil.newArrayList("aaaaa", "bb", "cc", "dd", DateUtil.date(), 3.22676575765); - final List row2 = CollUtil.newArrayList("aa1", "bb1", "cc1", "dd1", DateUtil.date(), 250.7676); - final List row3 = CollUtil.newArrayList("aa2", "bb2", "cc2", "dd2", DateUtil.date(), 0.111); - final List row4 = CollUtil.newArrayList("aa3", "bb3", "cc3", "dd3", DateUtil.date(), 35); - final List row5 = CollUtil.newArrayList("aa4", "bb4", "cc4", "dd4", DateUtil.date(), 28.00); + final List row1 = ListUtil.of("aaaaa", "bb", "cc", "dd", DateUtil.date(), 3.22676575765); + final List row2 = ListUtil.of("aa1", "bb1", "cc1", "dd1", DateUtil.date(), 250.7676); + final List row3 = ListUtil.of("aa2", "bb2", "cc2", "dd2", DateUtil.date(), 0.111); + final List row4 = ListUtil.of("aa3", "bb3", "cc3", "dd3", DateUtil.date(), 35); + final List row5 = ListUtil.of("aa4", "bb4", "cc4", "dd4", DateUtil.date(), 28.00); - final List> rows = CollUtil.newArrayList(row1, row2, row3, row4, row5); + final List> rows = ListUtil.of(row1, row2, row3, row4, row5); for (int i = 0; i < 400; i++) { // 超大列表写出测试 rows.add(ObjUtil.clone(row1)); @@ -170,13 +169,13 @@ public class ExcelWriteTest { @Test @Ignore public void mergeTest() { - final List row1 = CollUtil.newArrayList("aa", "bb", "cc", "dd", DateUtil.date(), 3.22676575765); - final List row2 = CollUtil.newArrayList("aa1", "bb1", "cc1", "dd1", DateUtil.date(), 250.7676); - final List row3 = CollUtil.newArrayList("aa2", "bb2", "cc2", "dd2", DateUtil.date(), 0.111); - final List row4 = CollUtil.newArrayList("aa3", "bb3", "cc3", "dd3", DateUtil.date(), 35); - final List row5 = CollUtil.newArrayList("aa4", "bb4", "cc4", "dd4", DateUtil.date(), 28.00); + final List row1 = ListUtil.of("aa", "bb", "cc", "dd", DateUtil.date(), 3.22676575765); + final List row2 = ListUtil.of("aa1", "bb1", "cc1", "dd1", DateUtil.date(), 250.7676); + final List row3 = ListUtil.of("aa2", "bb2", "cc2", "dd2", DateUtil.date(), 0.111); + final List row4 = ListUtil.of("aa3", "bb3", "cc3", "dd3", DateUtil.date(), 35); + final List row5 = ListUtil.of("aa4", "bb4", "cc4", "dd4", DateUtil.date(), 28.00); - final List> rows = CollUtil.newArrayList(row1, row2, row3, row4, row5); + final List> rows = ListUtil.of(row1, row2, row3, row4, row5); // 通过工具类创建writer final ExcelWriter writer = ExcelUtil.getWriter("d:/test/mergeTest.xlsx"); @@ -214,7 +213,7 @@ public class ExcelWriteTest { row2.put("是否合格", false); row2.put("考试日期", DateUtil.date()); - final ArrayList> rows = CollUtil.newArrayList(row1, row2); + final ArrayList> rows = ListUtil.of(row1, row2); // 通过工具类创建writer final ExcelWriter writer = ExcelUtil.getWriter("d:/test/writeMapTest.xlsx"); @@ -244,7 +243,7 @@ public class ExcelWriteTest { row2.put("是否合格", false); row2.put("考试日期", DateUtil.date()); - final ArrayList> rows = CollUtil.newArrayList(row1, row2); + final ArrayList> rows = ListUtil.of(row1, row2); // 通过工具类创建writer final ExcelWriter writer = ExcelUtil.getWriter("e:/excel/writeMapTest.xlsx"); @@ -326,7 +325,7 @@ public class ExcelWriteTest { row2.put("score", 32.30); row2.put("examDate", DateUtil.date()); - final List> rows = CollUtil.newArrayList(row1, row2); + final List> rows = ListUtil.of(row1, row2); // 通过工具类创建writer final String file = "d:/test/writeMapAlias.xlsx"; FileUtil.del(file); @@ -361,7 +360,7 @@ public class ExcelWriteTest { row2.put("score", 32.30); row2.put("examDate", DateUtil.date()); - final List> rows = CollUtil.newArrayList(row1, row2); + final List> rows = ListUtil.of(row1, row2); // 通过工具类创建writer final String file = "f:/test/test_alias.xlsx"; FileUtil.del(file); @@ -394,7 +393,7 @@ public class ExcelWriteTest { row2.put("score", 32.30); row2.put("examDate", DateUtil.date()); - final List> rows = CollUtil.newArrayList(row1, row2); + final List> rows = ListUtil.of(row1, row2); // 通过工具类创建writer final String file = "d:/test/test_alias.xls"; final ExcelWriter writer = ExcelUtil.getWriter(file, "test1"); @@ -425,7 +424,7 @@ public class ExcelWriteTest { row2.put("score", 32.30); row2.put("examDate", DateUtil.date()); - final List> rows = CollUtil.newArrayList(row1, row2); + final List> rows = ListUtil.of(row1, row2); // 通过工具类创建writer final String file = "d:/test/test_alias.xls"; final ExcelWriter writer = ExcelUtil.getWriter(file, "test1"); @@ -459,7 +458,7 @@ public class ExcelWriteTest { bean2.setScore(38.50); bean2.setExamDate(DateUtil.date()); - final List rows = CollUtil.newArrayList(bean1, bean2); + final List rows = ListUtil.of(bean1, bean2); // 通过工具类创建writer final String file = "e:/writeBeanTest.xlsx"; FileUtil.del(file); @@ -491,7 +490,7 @@ public class ExcelWriteTest { order1.setNum("456"); order1.setBody("body2"); - final List rows = CollUtil.newArrayList(order1, order2); + final List rows = ListUtil.of(order1, order2); // 通过工具类创建writer final String file = "f:/test/writeBeanTest2.xlsx"; FileUtil.del(file); @@ -518,7 +517,7 @@ public class ExcelWriteTest { @Test @Ignore public void addSelectTest() { - final List row = CollUtil.newArrayList("姓名", "加班日期", "下班时间", "加班时长", "餐补", "车补次数", "车补", "总计"); + final List row = ListUtil.of("姓名", "加班日期", "下班时间", "加班时长", "餐补", "车补次数", "车补", "总计"); final ExcelWriter overtimeWriter = ExcelUtil.getWriter("d:/test/single_line.xlsx"); overtimeWriter.writeCellValue(3, 4, "AAAA"); overtimeWriter.addSelect(3, 4, row.toArray(new String[0])); @@ -675,7 +674,7 @@ public class ExcelWriteTest { public void writeNumberFormatTest() { final ExcelWriter writer = ExcelUtil.getWriter("d:/test/formatTest.xlsx"); writer.disableDefaultStyle(); - writer.writeRow(ListUtil.toList(51.33333333, 90.111111111)); + writer.writeRow(ListUtil.of(51.33333333, 90.111111111)); final CellStyle columnStyle = writer.createCellStyle(0, 0); columnStyle.setDataFormat((short) BuiltinFormats.getBuiltinFormat("0.00")); writer.close(); @@ -684,13 +683,13 @@ public class ExcelWriteTest { @Test @Ignore public void writeSecHeadRowTest() { - final List row1 = CollUtil.newArrayList(1, "aa", "bb", "cc", "dd", "ee"); - final List row2 = CollUtil.newArrayList(2, "aa1", "bb1", "cc1", "dd1", "ee1"); - final List row3 = CollUtil.newArrayList(3, "aa2", "bb2", "cc2", "dd2", "ee2"); - final List row4 = CollUtil.newArrayList(4, "aa3", "bb3", "cc3", "dd3", "ee3"); - final List row5 = CollUtil.newArrayList(5, "aa4", "bb4", "cc4", "dd4", "ee4"); + final List row1 = ListUtil.of(1, "aa", "bb", "cc", "dd", "ee"); + final List row2 = ListUtil.of(2, "aa1", "bb1", "cc1", "dd1", "ee1"); + final List row3 = ListUtil.of(3, "aa2", "bb2", "cc2", "dd2", "ee2"); + final List row4 = ListUtil.of(4, "aa3", "bb3", "cc3", "dd3", "ee3"); + final List row5 = ListUtil.of(5, "aa4", "bb4", "cc4", "dd4", "ee4"); - final List> rows = CollUtil.newArrayList(row1, row2, row3, row4, row5); + final List> rows = ListUtil.of(row1, row2, row3, row4, row5); // 通过工具类创建writer final ExcelWriter writer = ExcelUtil.getWriter("d:/test/writeSecHeadRowTest.xlsx"); @@ -719,7 +718,7 @@ public class ExcelWriteTest { writer.merge(2, 2, 4, 5, "DDEE", true); writer.setCurrentRow(3); - final List sechead = CollUtil.newArrayList("AA", "BB", "DD", "EE"); + final List sechead = ListUtil.of("AA", "BB", "DD", "EE"); writer.writeSecHeadRow(sechead); // 一次性写出内容,使用默认样式 writer.write(rows); @@ -801,7 +800,7 @@ public class ExcelWriteTest { @Ignore public void changeHeaderStyleTest(){ final ExcelWriter writer = ExcelUtil.getWriter("d:/test/headerStyle.xlsx"); - writer.writeHeadRow(ListUtil.of("姓名", "性别", "年龄")); + writer.writeHeadRow(ListUtil.view("姓名", "性别", "年龄")); final CellStyle headCellStyle = writer.getStyleSet().getHeadCellStyle(); headCellStyle.setFillForegroundColor(IndexedColors.YELLOW1.index); headCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); @@ -817,7 +816,7 @@ public class ExcelWriteTest { FileUtil.del(path); final ExcelWriter writer = ExcelUtil.getWriter(path); - writer.writeRow(ListUtil.of(22.9f)); + writer.writeRow(ListUtil.view(22.9f)); writer.close(); } @@ -827,7 +826,7 @@ public class ExcelWriteTest { // https://gitee.com/dromara/hutool/issues/I466ZZ // 需要输出S_20000314_x5116_0004 // 此处加入一个转义前缀:_x005F - final List row = ListUtil.of(new EscapeStrCellSetter("S_20000314_x5116_0004")); + final List row = ListUtil.view(new EscapeStrCellSetter("S_20000314_x5116_0004")); final ExcelWriter writer = ExcelUtil.getWriter("d:/test/_x.xlsx"); writer.writeRow(row); @@ -839,7 +838,7 @@ public class ExcelWriteTest { public void writeLongTest(){ //https://gitee.com/dromara/hutool/issues/I49R6U final ExcelWriter writer = ExcelUtil.getWriter("d:/test/long.xlsx"); - writer.write(ListUtil.of(1427545395336093698L)); + writer.write(ListUtil.view(1427545395336093698L)); writer.close(); } @@ -850,7 +849,7 @@ public class ExcelWriteTest { final Hyperlink hyperlink = writer.createHyperlink(HyperlinkType.URL, "https://hutool.cn"); - writer.write(ListUtil.of(hyperlink)); + writer.write(ListUtil.view(hyperlink)); writer.close(); } diff --git a/hutool-poi/src/test/java/cn/hutool/poi/excel/Issue2221Test.java b/hutool-poi/src/test/java/cn/hutool/poi/excel/Issue2221Test.java index 19b88aea1..696b5a12d 100755 --- a/hutool-poi/src/test/java/cn/hutool/poi/excel/Issue2221Test.java +++ b/hutool-poi/src/test/java/cn/hutool/poi/excel/Issue2221Test.java @@ -27,7 +27,7 @@ public class Issue2221Test { writer.setOnlyAlias(true); // 写入数据 - final List> data = ListUtil.of( + final List> data = ListUtil.view( MapUtil.ofEntries(MapUtil.entry("androidLc", "1次"), MapUtil.entry("androidAc", "3人")), MapUtil.ofEntries(MapUtil.entry("androidLc", "1次"), MapUtil.entry("androidAc", "3人")) ); @@ -75,7 +75,7 @@ public class Issue2221Test { writer.merge(0, 0, 3, 4, "新增人数", true); // 写入数据 - final List> data = ListUtil.of( + final List> data = ListUtil.view( MapUtil.ofEntries( MapUtil.entry("date", "2022-01-01"), MapUtil.entry("androidLc", "1次"), diff --git a/hutool-poi/src/test/java/cn/hutool/poi/excel/Issue2307Test.java b/hutool-poi/src/test/java/cn/hutool/poi/excel/Issue2307Test.java new file mode 100644 index 000000000..2d06a5e00 --- /dev/null +++ b/hutool-poi/src/test/java/cn/hutool/poi/excel/Issue2307Test.java @@ -0,0 +1,59 @@ +package cn.hutool.poi.excel; + +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.io.FileUtil; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.junit.Ignore; +import org.junit.Test; + +import java.util.List; + +public class Issue2307Test { + + @Test + @Ignore + public void writeTest(){ + final String filePath = "d:/test/issue2307.xlsx"; + FileUtil.del(filePath); + + final List row1 = ListUtil.of("设备1", 11, 111, 1111.444, 1111.444, 1111.444, 1111.444, 119999999999999999999999999999999999999999911.444); + final List row2 = ListUtil.of("设备2", 22, 222, 2222.555, 2222.555, 2222.555, 2222.555, 2222.555); + final List row3 = ListUtil.of("设备3", 33, 333, 3333, 3333, 3333, 3333, 3333); + final List row4 = ListUtil.of("设备4", 44, 444, 4444, 1, 2, 3, 4); + final List row5 = ListUtil.of("设备5", "x1", "x2", "x3", 4, 5, 6, 7); + + final List> rows = ListUtil.of(row1, row2, row3, row4, row5); + //通过工具类创建writer + try (final ExcelWriter writer = ExcelUtil.getWriter(filePath)) { + + //合并单元格后的标题行,使用默认标题样式 + writer.merge(row1.size() - 1, "测试标题"); + + + //一次性写出内容,强制输出标题 + writer.write(rows, true); + + + final StyleSet style = writer.getStyleSet(); + final CellStyle cellStyleForNumber = style.getCellStyleForNumber(); + cellStyleForNumber.setAlignment(HorizontalAlignment.RIGHT); + + final CellStyle cellStyle = style.getCellStyle(); + cellStyle.setAlignment(HorizontalAlignment.RIGHT); + + + final XSSFSheet sheet = (XSSFSheet) writer.getSheet(); + + for (int i = 1; i < 8; i++) { + sheet.autoSizeColumn(i); + } + + // 空串,实际应该有值 + System.out.println("writer.getCell(1,0): " + writer.getCell(0,1)); + System.out.println("writer.getCell(1,1): " + writer.getCell(1,1)); + System.out.println("sheet.getRow(1).getCell(0): " + sheet.getRow(1).getCell(0)); + } + } +} diff --git a/hutool-poi/src/test/java/cn/hutool/poi/word/WordWriterTest.java b/hutool-poi/src/test/java/cn/hutool/poi/word/WordWriterTest.java index 895a94749..4e7c6f0bc 100644 --- a/hutool-poi/src/test/java/cn/hutool/poi/word/WordWriterTest.java +++ b/hutool-poi/src/test/java/cn/hutool/poi/word/WordWriterTest.java @@ -1,6 +1,5 @@ package cn.hutool.poi.word; -import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; @@ -49,7 +48,7 @@ public class WordWriterTest { map.put("成绩", 88.32); map.put("是否合格", true); - writer.addTable(CollUtil.newArrayList(map)); + writer.addTable(ListUtil.of(map)); writer.flush(FileUtil.file("d:/test/test.docx")); } @@ -72,7 +71,7 @@ public class WordWriterTest { data2.put("是否合格", false); data2.put("考试日期", DateUtil.date()); - final ArrayList> mapArrayList = CollUtil.newArrayList(data, data2); + final ArrayList> mapArrayList = ListUtil.of(data, data2); // 添加段落(标题) writer.addText(new Font("方正小标宋简体", Font.PLAIN, 22), "我是第一部分"); @@ -88,8 +87,8 @@ public class WordWriterTest { @Test public void overflowTest(){ final Word07Writer word07Writer = new Word07Writer(); - final List list = ListUtil.list(false); - final List list2 = ListUtil.list(false); + final List list = ListUtil.of(false); + final List list2 = ListUtil.of(false); list.add("溢出测试"); list2.add(list); word07Writer.addTable(list); diff --git a/hutool-setting/src/main/java/cn/hutool/setting/GroupedSet.java b/hutool-setting/src/main/java/cn/hutool/setting/GroupedSet.java index bc0626570..5663a8412 100644 --- a/hutool-setting/src/main/java/cn/hutool/setting/GroupedSet.java +++ b/hutool-setting/src/main/java/cn/hutool/setting/GroupedSet.java @@ -279,7 +279,7 @@ public class GroupedSet extends HashMap> { public boolean contains(final String group, final String value, final String... otherValues) { if (ArrayUtil.isNotEmpty(otherValues)) { // 需要测试多个值的情况 - final List valueList = ListUtil.toList(otherValues); + final List valueList = ListUtil.of(otherValues); valueList.add(value); return contains(group, valueList); } else { diff --git a/hutool-setting/src/main/java/cn/hutool/setting/Setting.java b/hutool-setting/src/main/java/cn/hutool/setting/Setting.java index d201f1c8f..7332c5f02 100644 --- a/hutool-setting/src/main/java/cn/hutool/setting/Setting.java +++ b/hutool-setting/src/main/java/cn/hutool/setting/Setting.java @@ -1,6 +1,6 @@ package cn.hutool.setting; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IoUtil; @@ -13,9 +13,9 @@ import cn.hutool.core.io.watch.SimpleWatcher; import cn.hutool.core.io.watch.WatchMonitor; import cn.hutool.core.io.watch.WatchUtil; import cn.hutool.core.lang.Assert; +import cn.hutool.core.text.StrUtil; import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.CharsetUtil; -import cn.hutool.core.text.StrUtil; import cn.hutool.log.StaticLog; import cn.hutool.setting.dialect.Props; @@ -437,7 +437,7 @@ public class Setting extends AbsSetting implements Map { * @return 获得所有分组名 */ public List getGroups() { - return CollUtil.newArrayList(this.groupedMap.keySet()); + return ListUtil.of(this.groupedMap.keySet()); } /** diff --git a/hutool-socket/src/main/java/cn/hutool/socket/ChannelUtil.java b/hutool-socket/src/main/java/cn/hutool/socket/ChannelUtil.java new file mode 100644 index 000000000..67dbb084c --- /dev/null +++ b/hutool-socket/src/main/java/cn/hutool/socket/ChannelUtil.java @@ -0,0 +1,62 @@ +package cn.hutool.socket; + +import cn.hutool.core.io.IORuntimeException; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.thread.ThreadFactoryBuilder; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.channels.AsynchronousChannelGroup; +import java.nio.channels.AsynchronousSocketChannel; +import java.util.concurrent.ExecutionException; + +/** + * Channel相关封装 + * + * @author looly + * @since 5.8.2 + */ +public class ChannelUtil { + + /** + * 创建{@link AsynchronousChannelGroup} + * + * @param poolSize 线程池大小 + * @return {@link AsynchronousChannelGroup} + */ + public static AsynchronousChannelGroup createFixedGroup(final int poolSize) { + + try { + return AsynchronousChannelGroup.withFixedThreadPool(// + poolSize, // 默认线程池大小 + ThreadFactoryBuilder.create().setNamePrefix("Huool-socket-").build()// + ); + } catch (final IOException e) { + throw new IORuntimeException(e); + } + } + + /** + * 连接到指定地址 + * + * @param group {@link AsynchronousChannelGroup} + * @param address 地址信息,包括地址和端口 + * @return {@link AsynchronousSocketChannel} + */ + public static AsynchronousSocketChannel connect(final AsynchronousChannelGroup group, final InetSocketAddress address) { + final AsynchronousSocketChannel channel; + try { + channel = AsynchronousSocketChannel.open(group); + } catch (final IOException e) { + throw new IORuntimeException(e); + } + + try { + channel.connect(address).get(); + } catch (final InterruptedException | ExecutionException e) { + IoUtil.close(channel); + throw new SocketRuntimeException(e); + } + return channel; + } +} diff --git a/hutool-socket/src/main/java/cn/hutool/socket/aio/AioClient.java b/hutool-socket/src/main/java/cn/hutool/socket/aio/AioClient.java index 27bd6726e..bc40816db 100644 --- a/hutool-socket/src/main/java/cn/hutool/socket/aio/AioClient.java +++ b/hutool-socket/src/main/java/cn/hutool/socket/aio/AioClient.java @@ -1,19 +1,14 @@ package cn.hutool.socket.aio; -import cn.hutool.core.io.IORuntimeException; -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.thread.ThreadFactoryBuilder; +import cn.hutool.socket.ChannelUtil; import cn.hutool.socket.SocketConfig; -import cn.hutool.socket.SocketRuntimeException; import java.io.Closeable; import java.io.IOException; import java.net.InetSocketAddress; import java.net.SocketOption; import java.nio.ByteBuffer; -import java.nio.channels.AsynchronousChannelGroup; import java.nio.channels.AsynchronousSocketChannel; -import java.util.concurrent.ExecutionException; /** * Aio Socket客户端 @@ -21,14 +16,14 @@ import java.util.concurrent.ExecutionException; * @author looly * @since 4.5.0 */ -public class AioClient implements Closeable{ +public class AioClient implements Closeable { private final AioSession session; /** * 构造 * - * @param address 地址 + * @param address 地址 * @param ioAction IO处理类 */ public AioClient(final InetSocketAddress address, final IoAction ioAction) { @@ -38,9 +33,9 @@ public class AioClient implements Closeable{ /** * 构造 * - * @param address 地址 + * @param address 地址 * @param ioAction IO处理类 - * @param config 配置项 + * @param config 配置项 */ public AioClient(final InetSocketAddress address, final IoAction ioAction, final SocketConfig config) { this(createChannel(address, config.getThreadPoolSize()), ioAction, config); @@ -49,9 +44,9 @@ public class AioClient implements Closeable{ /** * 构造 * - * @param channel {@link AsynchronousSocketChannel} + * @param channel {@link AsynchronousSocketChannel} * @param ioAction IO处理类 - * @param config 配置项 + * @param config 配置项 */ public AioClient(final AsynchronousSocketChannel channel, final IoAction ioAction, final SocketConfig config) { this.session = new AioSession(channel, ioAction, config); @@ -62,8 +57,8 @@ public class AioClient implements Closeable{ * 设置 Socket 的 Option 选项
    * 选项见:{@link java.net.StandardSocketOptions} * - * @param 选项泛型 - * @param name {@link SocketOption} 枚举 + * @param 选项泛型 + * @param name {@link SocketOption} 枚举 * @param value SocketOption参数 * @return this * @throws IOException IO异常 @@ -112,33 +107,16 @@ public class AioClient implements Closeable{ } // ------------------------------------------------------------------------------------- Private method start + /** * 初始化 * - * @param address 地址和端口 + * @param address 地址和端口 * @param poolSize 线程池大小 * @return this */ private static AsynchronousSocketChannel createChannel(final InetSocketAddress address, final int poolSize) { - - final AsynchronousSocketChannel channel; - try { - final AsynchronousChannelGroup group = AsynchronousChannelGroup.withFixedThreadPool(// - poolSize, // 默认线程池大小 - ThreadFactoryBuilder.create().setNamePrefix("Huool-socket-").build()// - ); - channel = AsynchronousSocketChannel.open(group); - } catch (final IOException e) { - throw new IORuntimeException(e); - } - - try { - channel.connect(address).get(); - } catch (final InterruptedException | ExecutionException e) { - IoUtil.close(channel); - throw new SocketRuntimeException(e); - } - return channel; + return ChannelUtil.connect(ChannelUtil.createFixedGroup(poolSize), address); } // ------------------------------------------------------------------------------------- Private method end } diff --git a/hutool-socket/src/main/java/cn/hutool/socket/nio/AcceptHandler.java b/hutool-socket/src/main/java/cn/hutool/socket/nio/AcceptHandler.java index 18fbec33b..2a7d25222 100644 --- a/hutool-socket/src/main/java/cn/hutool/socket/nio/AcceptHandler.java +++ b/hutool-socket/src/main/java/cn/hutool/socket/nio/AcceptHandler.java @@ -27,7 +27,7 @@ public class AcceptHandler implements CompletionHandler *

    - * 来自:https://github.com/rtyley/animated-gif-lib-for-java + * 来自:https://github.com/rtyley/animated-gif-lib-for-java * * @author Kevin Weiner, FM Software; LZW decoder adapted from John Cristy's ImageMagick. */ @@ -357,10 +357,10 @@ public class GifDecoder { final int NullCode = -1; final int npix = iw * ih; int available; - int clear; + final int clear; int code_mask; int code_size; - int end_of_information; + final int end_of_information; int in_code; int old_code; int bits; diff --git a/hutool-swing/src/main/java/cn/hutool/swing/img/gif/NeuQuant.java b/hutool-swing/src/main/java/cn/hutool/swing/img/gif/NeuQuant.java index d7f4ae7bd..ff128f59e 100755 --- a/hutool-swing/src/main/java/cn/hutool/swing/img/gif/NeuQuant.java +++ b/hutool-swing/src/main/java/cn/hutool/swing/img/gif/NeuQuant.java @@ -184,7 +184,7 @@ public class NeuQuant { int radius; int rad; int alpha; - int step; + final int step; int delta; final int samplepixels; final byte[] p;