From eec404f8750d25c7c6c9bc53a3a51b5904b84a7e Mon Sep 17 00:00:00 2001 From: Looly Date: Sun, 17 Nov 2019 14:28:40 +0800 Subject: [PATCH 01/17] prepare 5.0.7 --- CHANGELOG.md | 8 ++++++++ README.md | 8 ++++---- bin/version.txt | 2 +- docs/js/version.js | 2 +- hutool-all/pom.xml | 2 +- hutool-aop/pom.xml | 2 +- hutool-bloomFilter/pom.xml | 2 +- hutool-bom/pom.xml | 2 +- hutool-cache/pom.xml | 2 +- hutool-captcha/pom.xml | 2 +- hutool-core/pom.xml | 2 +- hutool-cron/pom.xml | 2 +- hutool-crypto/pom.xml | 2 +- hutool-db/pom.xml | 2 +- hutool-dfa/pom.xml | 2 +- hutool-extra/pom.xml | 2 +- hutool-http/pom.xml | 2 +- hutool-json/pom.xml | 2 +- hutool-log/pom.xml | 2 +- hutool-poi/pom.xml | 2 +- hutool-script/pom.xml | 2 +- hutool-setting/pom.xml | 2 +- hutool-socket/pom.xml | 2 +- hutool-system/pom.xml | 2 +- pom.xml | 2 +- 25 files changed, 35 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d44c1d85..da416a02b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,14 @@ ------------------------------------------------------------------------------------------------------------- +## 5.0.7 + +### 新特性 + +### Bug修复 + +------------------------------------------------------------------------------------------------------------- + ## 5.0.6 ### 新特性 diff --git a/README.md b/README.md index ba95dc510..f18b1165d 100644 --- a/README.md +++ b/README.md @@ -116,21 +116,21 @@ Hutool的存在就是为了减少代码搜索成本,避免网络上参差不 cn.hutool hutool-all - 5.0.6 + 5.0.7 ``` ### Gradle ``` -compile 'cn.hutool:hutool-all:5.0.6' +compile 'cn.hutool:hutool-all:5.0.7' ``` ### 非Maven项目 点击以下任一链接,下载`hutool-all-X.X.X.jar`即可: -- [Maven中央库1](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.0.6/) -- [Maven中央库2](http://repo2.maven.org/maven2/cn/hutool/hutool-all/5.0.6/) +- [Maven中央库1](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.0.7/) +- [Maven中央库2](http://repo2.maven.org/maven2/cn/hutool/hutool-all/5.0.7/) > 注意 > Hutool 5.x支持JDK8+,对Android平台没有测试,不能保证所有工具类获工具方法可用。 diff --git a/bin/version.txt b/bin/version.txt index c20c645d7..00433367c 100755 --- a/bin/version.txt +++ b/bin/version.txt @@ -1 +1 @@ -5.0.6 +5.0.7 diff --git a/docs/js/version.js b/docs/js/version.js index db4f9bff6..4a481c426 100644 --- a/docs/js/version.js +++ b/docs/js/version.js @@ -1 +1 @@ -var version = '5.0.6' \ No newline at end of file +var version = '5.0.7' \ No newline at end of file diff --git a/hutool-all/pom.xml b/hutool-all/pom.xml index 017bb9ae4..9b8307bc1 100644 --- a/hutool-all/pom.xml +++ b/hutool-all/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.0.6 + 5.0.7-SNAPSHOT hutool-all diff --git a/hutool-aop/pom.xml b/hutool-aop/pom.xml index 97d96b14b..17ad5dba5 100644 --- a/hutool-aop/pom.xml +++ b/hutool-aop/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.0.6 + 5.0.7-SNAPSHOT hutool-aop diff --git a/hutool-bloomFilter/pom.xml b/hutool-bloomFilter/pom.xml index f2618a214..cecf6ebeb 100644 --- a/hutool-bloomFilter/pom.xml +++ b/hutool-bloomFilter/pom.xml @@ -7,7 +7,7 @@ cn.hutool hutool-parent - 5.0.6 + 5.0.7-SNAPSHOT hutool-bloomFilter diff --git a/hutool-bom/pom.xml b/hutool-bom/pom.xml index 15b058ab4..7e74c28d2 100644 --- a/hutool-bom/pom.xml +++ b/hutool-bom/pom.xml @@ -7,7 +7,7 @@ cn.hutool hutool-parent - 5.0.6 + 5.0.7-SNAPSHOT hutool-bom diff --git a/hutool-cache/pom.xml b/hutool-cache/pom.xml index 868e362e5..551a28561 100644 --- a/hutool-cache/pom.xml +++ b/hutool-cache/pom.xml @@ -7,7 +7,7 @@ cn.hutool hutool-parent - 5.0.6 + 5.0.7-SNAPSHOT hutool-cache diff --git a/hutool-captcha/pom.xml b/hutool-captcha/pom.xml index 7a83eea57..7cdaed3c7 100644 --- a/hutool-captcha/pom.xml +++ b/hutool-captcha/pom.xml @@ -7,7 +7,7 @@ cn.hutool hutool-parent - 5.0.6 + 5.0.7-SNAPSHOT hutool-captcha diff --git a/hutool-core/pom.xml b/hutool-core/pom.xml index b864e8834..d7e551b52 100644 --- a/hutool-core/pom.xml +++ b/hutool-core/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.0.6 + 5.0.7-SNAPSHOT hutool-core diff --git a/hutool-cron/pom.xml b/hutool-cron/pom.xml index 93e5a3728..7b9822dfc 100644 --- a/hutool-cron/pom.xml +++ b/hutool-cron/pom.xml @@ -7,7 +7,7 @@ cn.hutool hutool-parent - 5.0.6 + 5.0.7-SNAPSHOT hutool-cron diff --git a/hutool-crypto/pom.xml b/hutool-crypto/pom.xml index 927a739f2..f8d3e15ab 100644 --- a/hutool-crypto/pom.xml +++ b/hutool-crypto/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.0.6 + 5.0.7-SNAPSHOT hutool-crypto diff --git a/hutool-db/pom.xml b/hutool-db/pom.xml index 2aca2764d..f54aa6786 100644 --- a/hutool-db/pom.xml +++ b/hutool-db/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.0.6 + 5.0.7-SNAPSHOT hutool-db diff --git a/hutool-dfa/pom.xml b/hutool-dfa/pom.xml index 3fd7fefc1..7cf11503a 100644 --- a/hutool-dfa/pom.xml +++ b/hutool-dfa/pom.xml @@ -7,7 +7,7 @@ cn.hutool hutool-parent - 5.0.6 + 5.0.7-SNAPSHOT hutool-dfa diff --git a/hutool-extra/pom.xml b/hutool-extra/pom.xml index e2231e936..cd44ac3cc 100644 --- a/hutool-extra/pom.xml +++ b/hutool-extra/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.0.6 + 5.0.7-SNAPSHOT hutool-extra diff --git a/hutool-http/pom.xml b/hutool-http/pom.xml index ee7ad6c60..4b28a3a3a 100644 --- a/hutool-http/pom.xml +++ b/hutool-http/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.0.6 + 5.0.7-SNAPSHOT hutool-http diff --git a/hutool-json/pom.xml b/hutool-json/pom.xml index d225c3e7e..426641446 100644 --- a/hutool-json/pom.xml +++ b/hutool-json/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.0.6 + 5.0.7-SNAPSHOT hutool-json diff --git a/hutool-log/pom.xml b/hutool-log/pom.xml index bf0ee01b9..bb5aaa25e 100644 --- a/hutool-log/pom.xml +++ b/hutool-log/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.0.6 + 5.0.7-SNAPSHOT hutool-log diff --git a/hutool-poi/pom.xml b/hutool-poi/pom.xml index 671460ad7..a4fe791ad 100644 --- a/hutool-poi/pom.xml +++ b/hutool-poi/pom.xml @@ -8,7 +8,7 @@ cn.hutool hutool-parent - 5.0.6 + 5.0.7-SNAPSHOT hutool-poi diff --git a/hutool-script/pom.xml b/hutool-script/pom.xml index b3de28cc1..e33cf7560 100644 --- a/hutool-script/pom.xml +++ b/hutool-script/pom.xml @@ -7,7 +7,7 @@ cn.hutool hutool-parent - 5.0.6 + 5.0.7-SNAPSHOT hutool-script diff --git a/hutool-setting/pom.xml b/hutool-setting/pom.xml index a894780c2..56116d43f 100644 --- a/hutool-setting/pom.xml +++ b/hutool-setting/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.0.6 + 5.0.7-SNAPSHOT hutool-setting diff --git a/hutool-socket/pom.xml b/hutool-socket/pom.xml index d89f596ab..186cd7c62 100644 --- a/hutool-socket/pom.xml +++ b/hutool-socket/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.0.6 + 5.0.7-SNAPSHOT hutool-socket diff --git a/hutool-system/pom.xml b/hutool-system/pom.xml index e369acd03..b2fd43f07 100644 --- a/hutool-system/pom.xml +++ b/hutool-system/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.0.6 + 5.0.7-SNAPSHOT hutool-system diff --git a/pom.xml b/pom.xml index 4648aead0..7d8546cef 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ cn.hutool hutool-parent - 5.0.6 + 5.0.7-SNAPSHOT hutool 提供丰富的Java工具方法 https://github.com/looly/hutool From 106ea5a7592bbfb1cf96436cc2d3b017741b5ac8 Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 20 Nov 2019 00:15:52 +0800 Subject: [PATCH 02/17] fix code --- CHANGELOG.md | 3 + .../java/cn/hutool/core/bean/BeanUtil.java | 30 +- .../java/cn/hutool/core/util/ArrayUtil.java | 74 +-- .../java/cn/hutool/core/util/IdcardUtil.java | 21 +- .../java/cn/hutool/core/util/NumberUtil.java | 595 +++++++++--------- .../java/cn/hutool/core/util/ObjectUtil.java | 2 + .../cn/hutool/core/util/NumberUtilTest.java | 4 +- .../java/cn/hutool/extra/ftp/AbstractFtp.java | 9 +- .../main/java/cn/hutool/extra/ftp/Ftp.java | 6 +- .../java/cn/hutool/extra/ssh/JschUtil.java | 5 +- .../main/java/cn/hutool/extra/ssh/Sftp.java | 24 +- .../java/cn/hutool/system/RuntimeInfo.java | 4 +- 12 files changed, 399 insertions(+), 378 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index da416a02b..589e2e735 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,11 @@ ## 5.0.7 ### 新特性 +* 【core 】 解决NumberUtil导致的ambiguous问题(issue#630@Github) +* 【core 】 BeanUtil.isEmpty()忽略字段支持,增加isNotEmpty(issue#629@Github) ### Bug修复 +* 【extra】 修复SFTP.upload上传失败的问题 ------------------------------------------------------------------------------------------------------------- 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 65e36053c..05b7a39c3 100644 --- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java @@ -292,7 +292,7 @@ public class BeanUtil { /** * 解析Bean中的属性值 * - * @param 属性值类型 + * @param 属性值类型 * @param bean Bean对象,支持Map、List、Collection、Array * @param expression 表达式,例如:person.friend[5].name * @return Bean属性值 @@ -676,17 +676,31 @@ public class BeanUtil { return bean; } + /** + * 判断Bean是否为非空对象,非空对象表示本身不为null或者含有非null属性的对象 + * + * @param bean Bean对象 + * @param ignoreFiledNames 忽略检查的字段名 + * @return 是否为空,true - 空 / false - 非空 + * @since 5.0.7 + */ + public static boolean isNotEmpty(Object bean, String... ignoreFiledNames) { + return false == isEmpty(bean, ignoreFiledNames); + } + /** * 判断Bean是否为空对象,空对象表示本身为null或者所有属性都为null * - * @param bean Bean对象 + * @param bean Bean对象 + * @param ignoreFiledNames 忽略检查的字段名 * @return 是否为空,true - 空 / false - 非空 * @since 4.1.10 */ - public static boolean isEmpty(Object bean) { + public static boolean isEmpty(Object bean, String... ignoreFiledNames) { if (null != bean) { for (Field field : ReflectUtil.getFields(bean.getClass())) { - if (null != ReflectUtil.getFieldValue(bean, field)) { + if ((false == ArrayUtil.contains(ignoreFiledNames, field.getName())) + && null != ReflectUtil.getFieldValue(bean, field)) { return false; } } @@ -698,16 +712,18 @@ public class BeanUtil { * 判断Bean是否包含值为null的属性
* 对象本身为null也返回true * - * @param bean Bean对象 + * @param bean Bean对象 + * @param ignoreFiledNames 忽略检查的字段名 * @return 是否包含值为null的属性,true - 包含 / false - 不包含 * @since 4.1.10 */ - public static boolean hasNullField(Object bean) { + public static boolean hasNullField(Object bean, String... ignoreFiledNames) { if (null == bean) { return true; } for (Field field : ReflectUtil.getFields(bean.getClass())) { - if (null == ReflectUtil.getFieldValue(bean, field)) { + if ((false == ArrayUtil.contains(ignoreFiledNames, field.getName()))// + && null == ReflectUtil.getFieldValue(bean, field)) { return true; } } 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 e8123ebd6..b08544f67 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java @@ -477,7 +477,7 @@ public class ArrayUtil { * @return 新数组 * @since 4.0.8 */ - @SuppressWarnings("unchecked") + @SuppressWarnings({"unchecked", "SuspiciousSystemArraycopy"}) public static Object insert(Object array, int index, T... newElements) { if (isEmpty(newElements)) { return array; @@ -541,6 +541,7 @@ public class ArrayUtil { final int length = length(array); final Object newArray = Array.newInstance(array.getClass().getComponentType(), newSize); if (newSize > 0 && isNotEmpty(array)) { + //noinspection SuspiciousSystemArraycopy System.arraycopy(array, 0, newArray, 0, Math.min(length, newSize)); } return newArray; @@ -656,6 +657,7 @@ public class ArrayUtil { * @since 3.0.6 */ public static Object copy(Object src, int srcPos, Object dest, int destPos, int length) { + //noinspection SuspiciousSystemArraycopy System.arraycopy(src, srcPos, dest, destPos, length); return dest; } @@ -671,6 +673,7 @@ public class ArrayUtil { * @since 3.0.6 */ public static Object copy(Object src, Object dest, int length) { + //noinspection SuspiciousSystemArraycopy System.arraycopy(src, 0, dest, 0, length); return dest; } @@ -1477,7 +1480,7 @@ public class ArrayUtil { final Integer[] array = new Integer[length]; for (int i = 0; i < length; i++) { - array[i] = Integer.valueOf(values[i]); + array[i] = values[i]; } return array; } @@ -1499,7 +1502,7 @@ public class ArrayUtil { final int[] array = new int[length]; for (int i = 0; i < length; i++) { - array[i] = values[i].intValue(); + array[i] = values[i]; } return array; } @@ -1521,7 +1524,7 @@ public class ArrayUtil { final Long[] array = new Long[length]; for (int i = 0; i < length; i++) { - array[i] = Long.valueOf(values[i]); + array[i] = values[i]; } return array; } @@ -1543,7 +1546,7 @@ public class ArrayUtil { final long[] array = new long[length]; for (int i = 0; i < length; i++) { - array[i] = values[i].longValue(); + array[i] = values[i]; } return array; } @@ -1565,7 +1568,7 @@ public class ArrayUtil { final Character[] array = new Character[length]; for (int i = 0; i < length; i++) { - array[i] = Character.valueOf(values[i]); + array[i] = values[i]; } return array; } @@ -1587,7 +1590,7 @@ public class ArrayUtil { char[] array = new char[length]; for (int i = 0; i < length; i++) { - array[i] = values[i].charValue(); + array[i] = values[i]; } return array; } @@ -1609,7 +1612,7 @@ public class ArrayUtil { final Byte[] array = new Byte[length]; for (int i = 0; i < length; i++) { - array[i] = Byte.valueOf(values[i]); + array[i] = values[i]; } return array; } @@ -1631,7 +1634,7 @@ public class ArrayUtil { final byte[] array = new byte[length]; for (int i = 0; i < length; i++) { - array[i] = values[i].byteValue(); + array[i] = ObjectUtil.defaultIfNull(values[i], (byte)0); } return array; } @@ -1653,7 +1656,7 @@ public class ArrayUtil { final Short[] array = new Short[length]; for (int i = 0; i < length; i++) { - array[i] = Short.valueOf(values[i]); + array[i] = values[i]; } return array; } @@ -1675,7 +1678,7 @@ public class ArrayUtil { final short[] array = new short[length]; for (int i = 0; i < length; i++) { - array[i] = values[i].shortValue(); + array[i] = ObjectUtil.defaultIfNull(values[i], (short)0); } return array; } @@ -1697,7 +1700,7 @@ public class ArrayUtil { final Float[] array = new Float[length]; for (int i = 0; i < length; i++) { - array[i] = Float.valueOf(values[i]); + array[i] = values[i]; } return array; } @@ -1719,7 +1722,7 @@ public class ArrayUtil { final float[] array = new float[length]; for (int i = 0; i < length; i++) { - array[i] = values[i].floatValue(); + array[i] = ObjectUtil.defaultIfNull(values[i], 0F); } return array; } @@ -1741,7 +1744,7 @@ public class ArrayUtil { final Double[] array = new Double[length]; for (int i = 0; i < length; i++) { - array[i] = Double.valueOf(values[i]); + array[i] = values[i]; } return array; } @@ -1763,7 +1766,7 @@ public class ArrayUtil { final double[] array = new double[length]; for (int i = 0; i < length; i++) { - array[i] = values[i].doubleValue(); + array[i] = ObjectUtil.defaultIfNull(values[i], 0D); } return array; } @@ -1785,7 +1788,7 @@ public class ArrayUtil { final Boolean[] array = new Boolean[length]; for (int i = 0; i < length; i++) { - array[i] = Boolean.valueOf(values[i]); + array[i] = values[i]; } return array; } @@ -1807,7 +1810,7 @@ public class ArrayUtil { final boolean[] array = new boolean[length]; for (int i = 0; i < length; i++) { - array[i] = values[i].booleanValue(); + array[i] = ObjectUtil.defaultIfNull(values[i], false); } return array; } @@ -2841,6 +2844,7 @@ public class ArrayUtil { * @throws IllegalArgumentException 参数对象不为数组对象 * @since 3.0.8 */ + @SuppressWarnings("SuspiciousSystemArraycopy") public static Object remove(Object array, int index) throws IllegalArgumentException { if (null == array) { return null; @@ -3339,9 +3343,9 @@ public class ArrayUtil { throw new IllegalArgumentException("Number array must not empty !"); } T min = numberArray[0]; - for (int i = 0; i < numberArray.length; i++) { - if (ObjectUtil.compare(min, numberArray[i]) > 0) { - min = numberArray[i]; + for (T t : numberArray) { + if (ObjectUtil.compare(min, t) > 0) { + min = t; } } return min; @@ -3359,7 +3363,7 @@ public class ArrayUtil { throw new IllegalArgumentException("Number array must not empty !"); } long min = numberArray[0]; - for (int i = 0; i < numberArray.length; i++) { + for (int i = 1; i < numberArray.length; i++) { if (min > numberArray[i]) { min = numberArray[i]; } @@ -3379,7 +3383,7 @@ public class ArrayUtil { throw new IllegalArgumentException("Number array must not empty !"); } int min = numberArray[0]; - for (int i = 0; i < numberArray.length; i++) { + for (int i = 1; i < numberArray.length; i++) { if (min > numberArray[i]) { min = numberArray[i]; } @@ -3399,7 +3403,7 @@ public class ArrayUtil { throw new IllegalArgumentException("Number array must not empty !"); } short min = numberArray[0]; - for (int i = 0; i < numberArray.length; i++) { + for (int i = 1; i < numberArray.length; i++) { if (min > numberArray[i]) { min = numberArray[i]; } @@ -3419,7 +3423,7 @@ public class ArrayUtil { throw new IllegalArgumentException("Number array must not empty !"); } char min = numberArray[0]; - for (int i = 0; i < numberArray.length; i++) { + for (int i = 1; i < numberArray.length; i++) { if (min > numberArray[i]) { min = numberArray[i]; } @@ -3439,7 +3443,7 @@ public class ArrayUtil { throw new IllegalArgumentException("Number array must not empty !"); } byte min = numberArray[0]; - for (int i = 0; i < numberArray.length; i++) { + for (int i = 1; i < numberArray.length; i++) { if (min > numberArray[i]) { min = numberArray[i]; } @@ -3459,7 +3463,7 @@ public class ArrayUtil { throw new IllegalArgumentException("Number array must not empty !"); } double min = numberArray[0]; - for (int i = 0; i < numberArray.length; i++) { + for (int i = 1; i < numberArray.length; i++) { if (min > numberArray[i]) { min = numberArray[i]; } @@ -3479,7 +3483,7 @@ public class ArrayUtil { throw new IllegalArgumentException("Number array must not empty !"); } float min = numberArray[0]; - for (int i = 0; i < numberArray.length; i++) { + for (int i = 1; i < numberArray.length; i++) { if (min > numberArray[i]) { min = numberArray[i]; } @@ -3500,7 +3504,7 @@ public class ArrayUtil { throw new IllegalArgumentException("Number array must not empty !"); } T max = numberArray[0]; - for (int i = 0; i < numberArray.length; i++) { + for (int i = 1; i < numberArray.length; i++) { if (ObjectUtil.compare(max, numberArray[i]) < 0) { max = numberArray[i]; } @@ -3520,7 +3524,7 @@ public class ArrayUtil { throw new IllegalArgumentException("Number array must not empty !"); } long max = numberArray[0]; - for (int i = 0; i < numberArray.length; i++) { + for (int i = 1; i < numberArray.length; i++) { if (max < numberArray[i]) { max = numberArray[i]; } @@ -3540,7 +3544,7 @@ public class ArrayUtil { throw new IllegalArgumentException("Number array must not empty !"); } int max = numberArray[0]; - for (int i = 0; i < numberArray.length; i++) { + for (int i = 1; i < numberArray.length; i++) { if (max < numberArray[i]) { max = numberArray[i]; } @@ -3560,7 +3564,7 @@ public class ArrayUtil { throw new IllegalArgumentException("Number array must not empty !"); } short max = numberArray[0]; - for (int i = 0; i < numberArray.length; i++) { + for (int i = 1; i < numberArray.length; i++) { if (max < numberArray[i]) { max = numberArray[i]; } @@ -3580,7 +3584,7 @@ public class ArrayUtil { throw new IllegalArgumentException("Number array must not empty !"); } char max = numberArray[0]; - for (int i = 0; i < numberArray.length; i++) { + for (int i = 1; i < numberArray.length; i++) { if (max < numberArray[i]) { max = numberArray[i]; } @@ -3600,7 +3604,7 @@ public class ArrayUtil { throw new IllegalArgumentException("Number array must not empty !"); } byte max = numberArray[0]; - for (int i = 0; i < numberArray.length; i++) { + for (int i = 1; i < numberArray.length; i++) { if (max < numberArray[i]) { max = numberArray[i]; } @@ -3620,7 +3624,7 @@ public class ArrayUtil { throw new IllegalArgumentException("Number array must not empty !"); } double max = numberArray[0]; - for (int i = 0; i < numberArray.length; i++) { + for (int i = 1; i < numberArray.length; i++) { if (max < numberArray[i]) { max = numberArray[i]; } @@ -3640,7 +3644,7 @@ public class ArrayUtil { throw new IllegalArgumentException("Number array must not empty !"); } float max = numberArray[0]; - for (int i = 0; i < numberArray.length; i++) { + for (int i = 1; i < numberArray.length; i++) { if (max < numberArray[i]) { max = numberArray[i]; } 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 3829d254b..71694ffe5 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/IdcardUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/IdcardUtil.java @@ -10,6 +10,7 @@ import cn.hutool.core.lang.Validator; import java.util.Date; import java.util.HashMap; import java.util.Map; +import java.util.Objects; /** * 身份证相关工具类
@@ -323,10 +324,10 @@ public class IdcardUtil { final char[] chars = mid.toCharArray(); int iflag = 8; for (char c : chars) { - sum += Integer.valueOf(String.valueOf(c)) * iflag; + sum += Integer.parseInt(String.valueOf(c)) * iflag; iflag--; } - return (sum % 10 == 0 ? 0 : (10 - sum % 10)) == Integer.valueOf(end); + return (sum % 10 == 0 ? 0 : (10 - sum % 10)) == Integer.parseInt(end); } /** @@ -360,7 +361,7 @@ public class IdcardUtil { char[] chars = mid.toCharArray(); int iflag = 7; for (char c : chars) { - sum = sum + Integer.valueOf(String.valueOf(c)) * iflag; + sum = sum + Integer.parseInt(String.valueOf(c)) * iflag; iflag--; } if ("A".equals(end.toUpperCase())) { @@ -389,13 +390,15 @@ public class IdcardUtil { * @return 生日(yyyyMMdd) */ public static String getBirth(String idCard) { + Assert.notBlank(idCard, "id card must be not blank!"); final int len = idCard.length(); if (len < CHINA_ID_MIN_LENGTH) { return null; } else if (len == CHINA_ID_MIN_LENGTH) { idCard = convert15To18(idCard); } - return idCard.substring(6, 14); + + return Objects.requireNonNull(idCard).substring(6, 14); } /** @@ -444,7 +447,7 @@ public class IdcardUtil { } else if (len == CHINA_ID_MIN_LENGTH) { idCard = convert15To18(idCard); } - return Short.valueOf(idCard.substring(6, 10)); + return Short.valueOf(Objects.requireNonNull(idCard).substring(6, 10)); } /** @@ -460,7 +463,7 @@ public class IdcardUtil { } else if (len == CHINA_ID_MIN_LENGTH) { idCard = convert15To18(idCard); } - return Short.valueOf(idCard.substring(10, 12)); + return Short.valueOf(Objects.requireNonNull(idCard).substring(10, 12)); } /** @@ -476,7 +479,7 @@ public class IdcardUtil { } else if (len == CHINA_ID_MIN_LENGTH) { idCard = convert15To18(idCard); } - return Short.valueOf(idCard.substring(12, 14)); + return Short.valueOf(Objects.requireNonNull(idCard).substring(12, 14)); } /** @@ -495,7 +498,7 @@ public class IdcardUtil { if (len == CHINA_ID_MIN_LENGTH) { idCard = convert15To18(idCard); } - char sCardChar = idCard.charAt(16); + char sCardChar = Objects.requireNonNull(idCard).charAt(16); return (sCardChar % 2 != 0) ? 1 : 0; } @@ -586,7 +589,7 @@ public class IdcardUtil { int iSum = 0; if (power.length == iArr.length) { for (int i = 0; i < iArr.length; i++) { - iSum += Integer.valueOf(String.valueOf(iArr[i])) * power[i]; + iSum += Integer.parseInt(String.valueOf(iArr[i])) * power[i]; } } return iSum; diff --git a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java index 3499fec3b..139774d68 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java @@ -18,13 +18,13 @@ import java.util.Set; * 数字工具类
* 对于精确值计算应该使用 {@link BigDecimal}
* JDK7中BigDecimal(double val)构造方法的结果有一定的不可预知性,例如: - * + * *
  * new BigDecimal(0.1)
  * 
- * + *

* 表示的不是0.1而是0.1000000000000000055511151231257827021181583404541015625 - * + * *

* 这是因为0.1无法准确的表示为double。因此应该使用new BigDecimal(String)。 *

@@ -33,18 +33,19 @@ import java.util.Set; *
  • http://www.oschina.net/code/snippet_563112_25237
  • *
  • https://github.com/venusdrogon/feilong-core/wiki/one-jdk7-bug-thinking
  • * - * - * @author Looly * + * @author Looly */ public class NumberUtil { - /** 默认除法运算精度 */ + /** + * 默认除法运算精度 + */ private static final int DEFAUT_DIV_SCALE = 10; /** * 提供精确的加法运算 - * + * * @param v1 被加数 * @param v2 加数 * @return 和 @@ -55,7 +56,7 @@ public class NumberUtil { /** * 提供精确的加法运算 - * + * * @param v1 被加数 * @param v2 加数 * @return 和 @@ -66,7 +67,7 @@ public class NumberUtil { /** * 提供精确的加法运算 - * + * * @param v1 被加数 * @param v2 加数 * @return 和 @@ -77,7 +78,7 @@ public class NumberUtil { /** * 提供精确的加法运算 - * + * * @param v1 被加数 * @param v2 加数 * @return 和 @@ -88,32 +89,33 @@ public class NumberUtil { /** * 提供精确的加法运算 - * + * * @param v1 被加数 * @param v2 加数 * @return 和 * @since 3.1.1 */ public static double add(Double v1, Double v2) { + //noinspection RedundantCast return add((Number) v1, (Number) v2).doubleValue(); } /** * 提供精确的加法运算
    * 如果传入多个值为null或者空,则返回0 - * + * * @param v1 被加数 * @param v2 加数 * @return 和 */ public static BigDecimal add(Number v1, Number v2) { - return add(new Number[] { v1, v2 }); + return add(new Number[]{v1, v2}); } /** * 提供精确的加法运算
    * 如果传入多个值为null或者空,则返回0 - * + * * @param values 多个被加值 * @return 和 * @since 4.0.0 @@ -137,7 +139,7 @@ public class NumberUtil { /** * 提供精确的加法运算
    * 如果传入多个值为null或者空,则返回0 - * + * * @param values 多个被加值 * @return 和 * @since 4.0.0 @@ -161,7 +163,7 @@ public class NumberUtil { /** * 提供精确的加法运算
    * 如果传入多个值为null或者空,则返回0 - * + * * @param values 多个被加值 * @return 和 * @since 4.0.0 @@ -184,7 +186,7 @@ public class NumberUtil { /** * 提供精确的减法运算 - * + * * @param v1 被减数 * @param v2 减数 * @return 差 @@ -195,7 +197,7 @@ public class NumberUtil { /** * 提供精确的减法运算 - * + * * @param v1 被减数 * @param v2 减数 * @return 差 @@ -206,7 +208,7 @@ public class NumberUtil { /** * 提供精确的减法运算 - * + * * @param v1 被减数 * @param v2 减数 * @return 差 @@ -217,7 +219,7 @@ public class NumberUtil { /** * 提供精确的减法运算 - * + * * @param v1 被减数 * @param v2 减数 * @return 差 @@ -228,31 +230,32 @@ public class NumberUtil { /** * 提供精确的减法运算 - * + * * @param v1 被减数 * @param v2 减数 * @return 差 */ public static double sub(Double v1, Double v2) { + //noinspection RedundantCast return sub((Number) v1, (Number) v2).doubleValue(); } /** * 提供精确的减法运算
    * 如果传入多个值为null或者空,则返回0 - * + * * @param v1 被减数 * @param v2 减数 * @return 差 */ public static BigDecimal sub(Number v1, Number v2) { - return sub(new Number[] { v1, v2 }); + return sub(new Number[]{v1, v2}); } /** * 提供精确的减法运算
    * 如果传入多个值为null或者空,则返回0 - * + * * @param values 多个被减值 * @return 差 * @since 4.0.0 @@ -276,7 +279,7 @@ public class NumberUtil { /** * 提供精确的减法运算
    * 如果传入多个值为null或者空,则返回0 - * + * * @param values 多个被减值 * @return 差 * @since 4.0.0 @@ -300,7 +303,7 @@ public class NumberUtil { /** * 提供精确的减法运算
    * 如果传入多个值为null或者空,则返回0 - * + * * @param values 多个被减值 * @return 差 * @since 4.0.0 @@ -323,7 +326,7 @@ public class NumberUtil { /** * 提供精确的乘法运算 - * + * * @param v1 被乘数 * @param v2 乘数 * @return 积 @@ -334,7 +337,7 @@ public class NumberUtil { /** * 提供精确的乘法运算 - * + * * @param v1 被乘数 * @param v2 乘数 * @return 积 @@ -345,7 +348,7 @@ public class NumberUtil { /** * 提供精确的乘法运算 - * + * * @param v1 被乘数 * @param v2 乘数 * @return 积 @@ -356,7 +359,7 @@ public class NumberUtil { /** * 提供精确的乘法运算 - * + * * @param v1 被乘数 * @param v2 乘数 * @return 积 @@ -368,31 +371,32 @@ public class NumberUtil { /** * 提供精确的乘法运算
    * 如果传入多个值为null或者空,则返回0 - * + * * @param v1 被乘数 * @param v2 乘数 * @return 积 */ public static double mul(Double v1, Double v2) { + //noinspection RedundantCast return mul((Number) v1, (Number) v2).doubleValue(); } /** * 提供精确的乘法运算
    * 如果传入多个值为null或者空,则返回0 - * + * * @param v1 被乘数 * @param v2 乘数 * @return 积 */ public static BigDecimal mul(Number v1, Number v2) { - return mul(new Number[] { v1, v2 }); + return mul(new Number[]{v1, v2}); } /** * 提供精确的乘法运算
    * 如果传入多个值为null或者空,则返回0 - * + * * @param values 多个被乘值 * @return 积 * @since 4.0.0 @@ -415,7 +419,7 @@ public class NumberUtil { /** * 提供精确的乘法运算 - * + * * @param v1 被乘数 * @param v2 乘数 * @return 积 @@ -428,7 +432,7 @@ public class NumberUtil { /** * 提供精确的乘法运算
    * 如果传入多个值为null或者空,则返回0 - * + * * @param values 多个被乘值 * @return 积 * @since 4.0.0 @@ -452,7 +456,7 @@ public class NumberUtil { /** * 提供精确的乘法运算
    * 如果传入多个值为null或者空,则返回0 - * + * * @param values 多个被乘值 * @return 积 * @since 4.0.0 @@ -475,7 +479,7 @@ public class NumberUtil { /** * 提供(相对)精确的除法运算,当发生除不尽的情况的时候,精确到小数点后10位,后面的四舍五入 - * + * * @param v1 被除数 * @param v2 除数 * @return 两个参数的商 @@ -486,7 +490,7 @@ public class NumberUtil { /** * 提供(相对)精确的除法运算,当发生除不尽的情况的时候,精确到小数点后10位,后面的四舍五入 - * + * * @param v1 被除数 * @param v2 除数 * @return 两个参数的商 @@ -497,7 +501,7 @@ public class NumberUtil { /** * 提供(相对)精确的除法运算,当发生除不尽的情况的时候,精确到小数点后10位,后面的四舍五入 - * + * * @param v1 被除数 * @param v2 除数 * @return 两个参数的商 @@ -508,7 +512,7 @@ public class NumberUtil { /** * 提供(相对)精确的除法运算,当发生除不尽的情况的时候,精确到小数点后10位,后面的四舍五入 - * + * * @param v1 被除数 * @param v2 除数 * @return 两个参数的商 @@ -519,7 +523,7 @@ public class NumberUtil { /** * 提供(相对)精确的除法运算,当发生除不尽的情况的时候,精确到小数点后10位,后面的四舍五入 - * + * * @param v1 被除数 * @param v2 除数 * @return 两个参数的商 @@ -530,7 +534,7 @@ public class NumberUtil { /** * 提供(相对)精确的除法运算,当发生除不尽的情况的时候,精确到小数点后10位,后面的四舍五入 - * + * * @param v1 被除数 * @param v2 除数 * @return 两个参数的商 @@ -542,7 +546,7 @@ public class NumberUtil { /** * 提供(相对)精确的除法运算,当发生除不尽的情况的时候,精确到小数点后10位,后面的四舍五入 - * + * * @param v1 被除数 * @param v2 除数 * @return 两个参数的商 @@ -553,9 +557,9 @@ public class NumberUtil { /** * 提供(相对)精确的除法运算,当发生除不尽的情况时,由scale指定精确度,后面的四舍五入 - * - * @param v1 被除数 - * @param v2 除数 + * + * @param v1 被除数 + * @param v2 除数 * @param scale 精确度,如果为负值,取绝对值 * @return 两个参数的商 */ @@ -565,9 +569,9 @@ public class NumberUtil { /** * 提供(相对)精确的除法运算,当发生除不尽的情况时,由scale指定精确度,后面的四舍五入 - * - * @param v1 被除数 - * @param v2 除数 + * + * @param v1 被除数 + * @param v2 除数 * @param scale 精确度,如果为负值,取绝对值 * @return 两个参数的商 */ @@ -577,9 +581,9 @@ public class NumberUtil { /** * 提供(相对)精确的除法运算,当发生除不尽的情况时,由scale指定精确度,后面的四舍五入 - * - * @param v1 被除数 - * @param v2 除数 + * + * @param v1 被除数 + * @param v2 除数 * @param scale 精确度,如果为负值,取绝对值 * @return 两个参数的商 */ @@ -589,9 +593,9 @@ public class NumberUtil { /** * 提供(相对)精确的除法运算,当发生除不尽的情况时,由scale指定精确度,后面的四舍五入 - * - * @param v1 被除数 - * @param v2 除数 + * + * @param v1 被除数 + * @param v2 除数 * @param scale 精确度,如果为负值,取绝对值 * @return 两个参数的商 */ @@ -601,9 +605,9 @@ public class NumberUtil { /** * 提供(相对)精确的除法运算,当发生除不尽的情况时,由scale指定精确度,后面的四舍五入 - * - * @param v1 被除数 - * @param v2 除数 + * + * @param v1 被除数 + * @param v2 除数 * @param scale 精确度,如果为负值,取绝对值 * @return 两个参数的商 */ @@ -613,9 +617,9 @@ public class NumberUtil { /** * 提供(相对)精确的除法运算,当发生除不尽的情况时,由scale指定精确度,后面的四舍五入 - * - * @param v1 被除数 - * @param v2 除数 + * + * @param v1 被除数 + * @param v2 除数 * @param scale 精确度,如果为负值,取绝对值 * @return 两个参数的商 * @since 3.1.0 @@ -626,9 +630,9 @@ public class NumberUtil { /** * 提供(相对)精确的除法运算,当发生除不尽的情况时,由scale指定精确度,后面的四舍五入 - * - * @param v1 被除数 - * @param v2 除数 + * + * @param v1 被除数 + * @param v2 除数 * @param scale 精确度,如果为负值,取绝对值 * @return 两个参数的商 */ @@ -638,10 +642,10 @@ public class NumberUtil { /** * 提供(相对)精确的除法运算,当发生除不尽的情况时,由scale指定精确度 - * - * @param v1 被除数 - * @param v2 除数 - * @param scale 精确度,如果为负值,取绝对值 + * + * @param v1 被除数 + * @param v2 除数 + * @param scale 精确度,如果为负值,取绝对值 * @param roundingMode 保留小数的模式 {@link RoundingMode} * @return 两个参数的商 */ @@ -651,10 +655,10 @@ public class NumberUtil { /** * 提供(相对)精确的除法运算,当发生除不尽的情况时,由scale指定精确度 - * - * @param v1 被除数 - * @param v2 除数 - * @param scale 精确度,如果为负值,取绝对值 + * + * @param v1 被除数 + * @param v2 除数 + * @param scale 精确度,如果为负值,取绝对值 * @param roundingMode 保留小数的模式 {@link RoundingMode} * @return 两个参数的商 */ @@ -664,10 +668,10 @@ public class NumberUtil { /** * 提供(相对)精确的除法运算,当发生除不尽的情况时,由scale指定精确度 - * - * @param v1 被除数 - * @param v2 除数 - * @param scale 精确度,如果为负值,取绝对值 + * + * @param v1 被除数 + * @param v2 除数 + * @param scale 精确度,如果为负值,取绝对值 * @param roundingMode 保留小数的模式 {@link RoundingMode} * @return 两个参数的商 */ @@ -677,10 +681,10 @@ public class NumberUtil { /** * 提供(相对)精确的除法运算,当发生除不尽的情况时,由scale指定精确度 - * - * @param v1 被除数 - * @param v2 除数 - * @param scale 精确度,如果为负值,取绝对值 + * + * @param v1 被除数 + * @param v2 除数 + * @param scale 精确度,如果为负值,取绝对值 * @param roundingMode 保留小数的模式 {@link RoundingMode} * @return 两个参数的商 */ @@ -690,23 +694,24 @@ public class NumberUtil { /** * 提供(相对)精确的除法运算,当发生除不尽的情况时,由scale指定精确度 - * - * @param v1 被除数 - * @param v2 除数 - * @param scale 精确度,如果为负值,取绝对值 + * + * @param v1 被除数 + * @param v2 除数 + * @param scale 精确度,如果为负值,取绝对值 * @param roundingMode 保留小数的模式 {@link RoundingMode} * @return 两个参数的商 */ public static double div(Double v1, Double v2, int scale, RoundingMode roundingMode) { + //noinspection RedundantCast return div((Number) v1, (Number) v2, scale, roundingMode).doubleValue(); } /** * 提供(相对)精确的除法运算,当发生除不尽的情况时,由scale指定精确度 - * - * @param v1 被除数 - * @param v2 除数 - * @param scale 精确度,如果为负值,取绝对值 + * + * @param v1 被除数 + * @param v2 除数 + * @param scale 精确度,如果为负值,取绝对值 * @param roundingMode 保留小数的模式 {@link RoundingMode} * @return 两个参数的商 * @since 3.1.0 @@ -717,10 +722,10 @@ public class NumberUtil { /** * 提供(相对)精确的除法运算,当发生除不尽的情况时,由scale指定精确度 - * - * @param v1 被除数 - * @param v2 除数 - * @param scale 精确度,如果为负值,取绝对值 + * + * @param v1 被除数 + * @param v2 除数 + * @param scale 精确度,如果为负值,取绝对值 * @param roundingMode 保留小数的模式 {@link RoundingMode} * @return 两个参数的商 */ @@ -730,10 +735,10 @@ public class NumberUtil { /** * 提供(相对)精确的除法运算,当发生除不尽的情况时,由scale指定精确度 - * - * @param v1 被除数 - * @param v2 除数 - * @param scale 精确度,如果为负值,取绝对值 + * + * @param v1 被除数 + * @param v2 除数 + * @param scale 精确度,如果为负值,取绝对值 * @param roundingMode 保留小数的模式 {@link RoundingMode} * @return 两个参数的商 * @since 3.0.9 @@ -750,12 +755,13 @@ public class NumberUtil { } // ------------------------------------------------------------------------------------------- round + /** * 保留固定位数小数
    * 采用四舍五入策略 {@link RoundingMode#HALF_UP}
    * 例如保留2位小数:123.456789 =》 123.46 - * - * @param v 值 + * + * @param v 值 * @param scale 保留小数位数 * @return 新值 */ @@ -767,8 +773,8 @@ public class NumberUtil { * 保留固定位数小数
    * 采用四舍五入策略 {@link RoundingMode#HALF_UP}
    * 例如保留2位小数:123.456789 =》 123.46 - * - * @param v 值 + * + * @param v 值 * @param scale 保留小数位数 * @return 新值 */ @@ -780,9 +786,9 @@ public class NumberUtil { * 保留固定位数小数
    * 采用四舍五入策略 {@link RoundingMode#HALF_UP}
    * 例如保留2位小数:123.456789 =》 123.46 - * + * * @param numberStr 数字值的字符串表现形式 - * @param scale 保留小数位数 + * @param scale 保留小数位数 * @return 新值 */ public static BigDecimal round(String numberStr, int scale) { @@ -793,9 +799,9 @@ public class NumberUtil { * 保留固定位数小数
    * 采用四舍五入策略 {@link RoundingMode#HALF_UP}
    * 例如保留2位小数:123.456789 =》 123.46 - * + * * @param number 数字值 - * @param scale 保留小数位数 + * @param scale 保留小数位数 * @return 新值 * @since 4.1.0 */ @@ -807,9 +813,9 @@ public class NumberUtil { * 保留固定位数小数
    * 采用四舍五入策略 {@link RoundingMode#HALF_UP}
    * 例如保留2位小数:123.456789 =》 123.46 - * + * * @param numberStr 数字值的字符串表现形式 - * @param scale 保留小数位数 + * @param scale 保留小数位数 * @return 新值 * @since 3.2.2 */ @@ -820,9 +826,9 @@ public class NumberUtil { /** * 保留固定位数小数
    * 例如保留四位小数:123.456789 =》 123.4567 - * - * @param v 值 - * @param scale 保留小数位数 + * + * @param v 值 + * @param scale 保留小数位数 * @param roundingMode 保留小数的模式 {@link RoundingMode} * @return 新值 */ @@ -833,9 +839,9 @@ public class NumberUtil { /** * 保留固定位数小数
    * 例如保留四位小数:123.456789 =》 123.4567 - * - * @param v 值 - * @param scale 保留小数位数 + * + * @param v 值 + * @param scale 保留小数位数 * @param roundingMode 保留小数的模式 {@link RoundingMode} * @return 新值 * @since 3.2.2 @@ -847,9 +853,9 @@ public class NumberUtil { /** * 保留固定位数小数
    * 例如保留四位小数:123.456789 =》 123.4567 - * - * @param numberStr 数字值的字符串表现形式 - * @param scale 保留小数位数,如果传入小于0,则默认0 + * + * @param numberStr 数字值的字符串表现形式 + * @param scale 保留小数位数,如果传入小于0,则默认0 * @param roundingMode 保留小数的模式 {@link RoundingMode},如果传入null则默认四舍五入 * @return 新值 */ @@ -864,9 +870,9 @@ public class NumberUtil { /** * 保留固定位数小数
    * 例如保留四位小数:123.456789 =》 123.4567 - * - * @param number 数字值 - * @param scale 保留小数位数,如果传入小于0,则默认0 + * + * @param number 数字值 + * @param scale 保留小数位数,如果传入小于0,则默认0 * @param roundingMode 保留小数的模式 {@link RoundingMode},如果传入null则默认四舍五入 * @return 新值 */ @@ -887,9 +893,9 @@ public class NumberUtil { /** * 保留固定位数小数
    * 例如保留四位小数:123.456789 =》 123.4567 - * - * @param numberStr 数字值的字符串表现形式 - * @param scale 保留小数位数 + * + * @param numberStr 数字值的字符串表现形式 + * @param scale 保留小数位数 * @param roundingMode 保留小数的模式 {@link RoundingMode} * @return 新值 * @since 3.2.2 @@ -903,7 +909,7 @@ public class NumberUtil { *

    * 四舍六入五成双是一种比较精确比较科学的计数保留法,是一种数字修约规则。 *

    - * + * *
     	 * 算法规则:
     	 * 四舍六入五考虑,
    @@ -912,9 +918,9 @@ public class NumberUtil {
     	 * 五前为偶应舍去,
     	 * 五前为奇要进一。
     	 * 
    - * + * * @param number 需要科学计算的数据 - * @param scale 保留的小数位 + * @param scale 保留的小数位 * @return 结果 * @since 4.1.0 */ @@ -927,7 +933,7 @@ public class NumberUtil { *

    * 四舍六入五成双是一种比较精确比较科学的计数保留法,是一种数字修约规则。 *

    - * + * *
     	 * 算法规则:
     	 * 四舍六入五考虑,
    @@ -936,7 +942,7 @@ public class NumberUtil {
     	 * 五前为偶应舍去,
     	 * 五前为奇要进一。
     	 * 
    - * + * * @param value 需要科学计算的数据 * @param scale 保留的小数位 * @return 结果 @@ -948,9 +954,9 @@ public class NumberUtil { /** * 保留固定小数位数,舍去多余位数 - * + * * @param number 需要科学计算的数据 - * @param scale 保留的小数位 + * @param scale 保留的小数位 * @return 结果 * @since 4.1.0 */ @@ -960,7 +966,7 @@ public class NumberUtil { /** * 保留固定小数位数,舍去多余位数 - * + * * @param value 需要科学计算的数据 * @param scale 保留的小数位 * @return 结果 @@ -971,22 +977,23 @@ public class NumberUtil { } // ------------------------------------------------------------------------------------------- decimalFormat + /** * 格式化double
    * 对 {@link DecimalFormat} 做封装
    - * + * * @param pattern 格式 格式中主要以 # 和 0 两种占位符号来指定数字长度。0 表示如果位数不足则以 0 填充,# 表示只要有可能就把数字拉上这个位置。
    - *
      - *
    • 0 =》 取一位整数
    • - *
    • 0.00 =》 取一位整数和两位小数
    • - *
    • 00.000 =》 取两位整数和三位小数
    • - *
    • # =》 取所有整数部分
    • - *
    • #.##% =》 以百分比方式计数,并取两位小数
    • - *
    • #.#####E0 =》 显示为科学计数法,并取五位小数
    • - *
    • ,### =》 每三位以逗号进行分隔,例如:299,792,458
    • - *
    • 光速大小为每秒,###米 =》 将格式嵌入文本
    • - *
    - * @param value 值 + *
      + *
    • 0 =》 取一位整数
    • + *
    • 0.00 =》 取一位整数和两位小数
    • + *
    • 00.000 =》 取两位整数和三位小数
    • + *
    • # =》 取所有整数部分
    • + *
    • #.##% =》 以百分比方式计数,并取两位小数
    • + *
    • #.#####E0 =》 显示为科学计数法,并取五位小数
    • + *
    • ,### =》 每三位以逗号进行分隔,例如:299,792,458
    • + *
    • 光速大小为每秒,###米 =》 将格式嵌入文本
    • + *
    + * @param value 值 * @return 格式化后的值 */ public static String decimalFormat(String pattern, double value) { @@ -996,19 +1003,19 @@ public class NumberUtil { /** * 格式化double
    * 对 {@link DecimalFormat} 做封装
    - * + * * @param pattern 格式 格式中主要以 # 和 0 两种占位符号来指定数字长度。0 表示如果位数不足则以 0 填充,# 表示只要有可能就把数字拉上这个位置。
    - *
      - *
    • 0 =》 取一位整数
    • - *
    • 0.00 =》 取一位整数和两位小数
    • - *
    • 00.000 =》 取两位整数和三位小数
    • - *
    • # =》 取所有整数部分
    • - *
    • #.##% =》 以百分比方式计数,并取两位小数
    • - *
    • #.#####E0 =》 显示为科学计数法,并取五位小数
    • - *
    • ,### =》 每三位以逗号进行分隔,例如:299,792,458
    • - *
    • 光速大小为每秒,###米 =》 将格式嵌入文本
    • - *
    - * @param value 值 + *
      + *
    • 0 =》 取一位整数
    • + *
    • 0.00 =》 取一位整数和两位小数
    • + *
    • 00.000 =》 取两位整数和三位小数
    • + *
    • # =》 取所有整数部分
    • + *
    • #.##% =》 以百分比方式计数,并取两位小数
    • + *
    • #.#####E0 =》 显示为科学计数法,并取五位小数
    • + *
    • ,### =》 每三位以逗号进行分隔,例如:299,792,458
    • + *
    • 光速大小为每秒,###米 =》 将格式嵌入文本
    • + *
    + * @param value 值 * @return 格式化后的值 * @since 3.0.5 */ @@ -1018,7 +1025,7 @@ public class NumberUtil { /** * 格式化金额输出,每三位用逗号分隔 - * + * * @param value 金额 * @return 格式化后的值 * @since 3.0.9 @@ -1029,9 +1036,9 @@ public class NumberUtil { /** * 格式化百分比,小数采用四舍五入方式 - * + * * @param number 值 - * @param scale 保留小数位数 + * @param scale 保留小数位数 * @return 百分比 * @since 3.2.3 */ @@ -1042,9 +1049,10 @@ public class NumberUtil { } // ------------------------------------------------------------------------------------------- isXXX + /** * 是否为数字,支持包括: - * + * *
     	 * 1、10进制
     	 * 2、16进制数字(0x开头)
    @@ -1052,7 +1060,7 @@ public class NumberUtil {
     	 * 4、类型标识形式(123D)
     	 * 5、正负数标识形式(+123、-234)
     	 * 
    - * + * * @param str 字符串值 * @return 是否为数字 */ @@ -1084,7 +1092,7 @@ public class NumberUtil { } } sz--; // don't want to loop to the last char, check it afterwords - // for type qualifiers + // for type qualifiers int i = start; // loop to the next to last char or to the last char if we need another digit to // make a valid number (e.g. chars[0..5] = "1234E") @@ -1156,7 +1164,7 @@ public class NumberUtil { /** * 判断String是否是整数
    * 支持10进制 - * + * * @param s String * @return 是否为整数 */ @@ -1172,7 +1180,7 @@ public class NumberUtil { /** * 判断字符串是否是Long类型
    * 支持10进制 - * + * * @param s String * @return 是否为{@link Long}类型 * @since 4.0.0 @@ -1188,7 +1196,7 @@ public class NumberUtil { /** * 判断字符串是否是浮点数 - * + * * @param s String * @return 是否为{@link Double}类型 */ @@ -1205,7 +1213,7 @@ public class NumberUtil { /** * 是否是质数(素数)
    * 质数表的质数又称素数。指整数在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。 - * + * * @param n 数字 * @return 是否是质数 */ @@ -1223,10 +1231,10 @@ public class NumberUtil { /** * 生成不重复随机数 根据给定的最小数字和最大数字,以及随机数的个数,产生指定的不重复的数组 - * + * * @param begin 最小数字(包含该数) - * @param end 最大数字(不包含该数) - * @param size 指定产生随机数的个数 + * @param end 最大数字(不包含该数) + * @param size 指定产生随机数的个数 * @return 随机int数组 */ public static int[] generateRandomNumber(int begin, int end, int size) { @@ -1261,10 +1269,10 @@ public class NumberUtil { /** * 生成不重复随机数 根据给定的最小数字和最大数字,以及随机数的个数,产生指定的不重复的数组 - * + * * @param begin 最小数字(包含该数) - * @param end 最大数字(不包含该数) - * @param size 指定产生随机数的个数 + * @param end 最大数字(不包含该数) + * @param size 指定产生随机数的个数 * @return 随机int数组 */ public static Integer[] generateBySet(int begin, int end, int size) { @@ -1288,9 +1296,10 @@ public class NumberUtil { } // ------------------------------------------------------------------------------------------- range + /** * 从0开始给定范围内的整数列表,步进为1 - * + * * @param stop 结束(包含) * @return 整数列表 * @since 3.3.1 @@ -1301,9 +1310,9 @@ public class NumberUtil { /** * 给定范围内的整数列表,步进为1 - * + * * @param start 开始(包含) - * @param stop 结束(包含) + * @param stop 结束(包含) * @return 整数列表 */ public static int[] range(int start, int stop) { @@ -1312,10 +1321,10 @@ public class NumberUtil { /** * 给定范围内的整数列表 - * + * * @param start 开始(包含) - * @param stop 结束(包含) - * @param step 步进 + * @param stop 结束(包含) + * @param step 步进 * @return 整数列表 */ public static int[] range(int start, int stop, int step) { @@ -1324,7 +1333,7 @@ public class NumberUtil { } else if (start > stop) { step = -Math.abs(step); } else {// start == end - return new int[] { start }; + return new int[]{start}; } int size = Math.abs((stop - start) / step) + 1; @@ -1339,9 +1348,9 @@ public class NumberUtil { /** * 将给定范围内的整数添加到已有集合中,步进为1 - * - * @param start 开始(包含) - * @param stop 结束(包含) + * + * @param start 开始(包含) + * @param stop 结束(包含) * @param values 集合 * @return 集合 */ @@ -1351,10 +1360,10 @@ public class NumberUtil { /** * 将给定范围内的整数添加到已有集合中 - * - * @param start 开始(包含) - * @param stop 结束(包含) - * @param step 步进 + * + * @param start 开始(包含) + * @param stop 结束(包含) + * @param step 步进 * @param values 集合 * @return 集合 */ @@ -1375,14 +1384,15 @@ public class NumberUtil { } // ------------------------------------------------------------------------------------------- others + /** * 计算阶乘 *

    * n! = n * (n-1) * ... * end *

    - * + * * @param start 阶乘起始 - * @param end 阶乘结束,必须小于起始 + * @param end 阶乘结束,必须小于起始 * @return 结果 * @since 4.1.0 */ @@ -1401,7 +1411,7 @@ public class NumberUtil { *

    * n! = n * (n-1) * ... * 2 * 1 *

    - * + * * @param n 阶乘起始 * @return 结果 */ @@ -1412,7 +1422,7 @@ public class NumberUtil { /** * 平方根算法
    * 推荐使用 {@link Math#sqrt(double)} - * + * * @param x 值 * @return 平方根 */ @@ -1435,9 +1445,9 @@ public class NumberUtil { /** * 可以用于计算双色球、大乐透注数的方法
    * 比如大乐透35选5可以这样调用processMultiple(7,5); 就是数学中的:C75=7*6/2*1 - * + * * @param selectNum 选中小球个数 - * @param minNum 最少要选中多少个小球 + * @param minNum 最少要选中多少个小球 * @return 注数 */ public static int processMultiple(int selectNum, int minNum) { @@ -1448,7 +1458,7 @@ public class NumberUtil { /** * 最大公约数 - * + * * @param m 第一个值 * @param n 第二个值 * @return 最大公约数 @@ -1464,7 +1474,7 @@ public class NumberUtil { /** * 最小公倍数 - * + * * @param m 第一个值 * @param n 第二个值 * @return 最小公倍数 @@ -1475,7 +1485,7 @@ public class NumberUtil { /** * 获得数字对应的二进制字符串 - * + * * @param number 数字 * @return 二进制字符串 */ @@ -1491,7 +1501,7 @@ public class NumberUtil { /** * 二进制转int - * + * * @param binaryStr 二进制字符串 * @return int */ @@ -1501,7 +1511,7 @@ public class NumberUtil { /** * 二进制转long - * + * * @param binaryStr 二进制字符串 * @return long */ @@ -1513,12 +1523,11 @@ public class NumberUtil { /** * 比较两个值的大小 - * - * @see Character#compare(char, char) - * + * * @param x 第一个值 * @param y 第二个值 * @return x==y返回0,x<y返回-1,x>y返回1 + * @see Character#compare(char, char) * @since 3.0.1 */ public static int compare(char x, char y) { @@ -1527,12 +1536,11 @@ public class NumberUtil { /** * 比较两个值的大小 - * - * @see Double#compare(double, double) - * + * * @param x 第一个值 * @param y 第二个值 * @return x==y返回0,x<y返回-1,x>y返回1 + * @see Double#compare(double, double) * @since 3.0.1 */ public static int compare(double x, double y) { @@ -1541,12 +1549,11 @@ public class NumberUtil { /** * 比较两个值的大小 - * - * @see Integer#compare(int, int) - * + * * @param x 第一个值 * @param y 第二个值 * @return x==y返回0,x<y返回-1,x>y返回1 + * @see Integer#compare(int, int) * @since 3.0.1 */ public static int compare(int x, int y) { @@ -1555,12 +1562,11 @@ public class NumberUtil { /** * 比较两个值的大小 - * - * @see Long#compare(long, long) - * + * * @param x 第一个值 * @param y 第二个值 * @return x==y返回0,x<y返回-1,x>y返回1 + * @see Long#compare(long, long) * @since 3.0.1 */ public static int compare(long x, long y) { @@ -1569,12 +1575,11 @@ public class NumberUtil { /** * 比较两个值的大小 - * - * @see Short#compare(short, short) - * + * * @param x 第一个值 * @param y 第二个值 * @return x==y返回0,x<y返回-1,x>y返回1 + * @see Short#compare(short, short) * @since 3.0.1 */ public static int compare(short x, short y) { @@ -1583,12 +1588,11 @@ public class NumberUtil { /** * 比较两个值的大小 - * - * @see Byte#compare(byte, byte) - * + * * @param x 第一个值 * @param y 第二个值 * @return x==y返回0,x<y返回-1,x>y返回1 + * @see Byte#compare(byte, byte) * @since 3.0.1 */ public static int compare(byte x, byte y) { @@ -1597,11 +1601,11 @@ public class NumberUtil { /** * 比较大小,参数1 > 参数2 返回true - * + * * @param bigNum1 数字1 * @param bigNum2 数字2 * @return 是否大于 - * @since 3,0.9 + * @since 3, 0.9 */ public static boolean isGreater(BigDecimal bigNum1, BigDecimal bigNum2) { Assert.notNull(bigNum1); @@ -1615,7 +1619,7 @@ public class NumberUtil { * @param bigNum1 数字1 * @param bigNum2 数字2 * @return 是否大于等于 - * @since 3,0.9 + * @since 3, 0.9 */ public static boolean isGreaterOrEqual(BigDecimal bigNum1, BigDecimal bigNum2) { Assert.notNull(bigNum1); @@ -1629,7 +1633,7 @@ public class NumberUtil { * @param bigNum1 数字1 * @param bigNum2 数字2 * @return 是否小于 - * @since 3,0.9 + * @since 3, 0.9 */ public static boolean isLess(BigDecimal bigNum1, BigDecimal bigNum2) { Assert.notNull(bigNum1); @@ -1643,7 +1647,7 @@ public class NumberUtil { * @param bigNum1 数字1 * @param bigNum2 数字2 * @return 是否小于等于 - * @since 3,0.9 + * @since 3, 0.9 */ public static boolean isLessOrEqual(BigDecimal bigNum1, BigDecimal bigNum2) { Assert.notNull(bigNum1); @@ -1655,7 +1659,7 @@ public class NumberUtil { * 比较大小,值相等 返回true
    * 此方法通过调用{@link BigDecimal#compareTo(BigDecimal)}方法来判断是否相等
    * 此方法判断值相等时忽略精度的,即0.00 == 0 - * + * * @param bigNum1 数字1 * @param bigNum2 数字2 * @return 是否相等 @@ -1668,13 +1672,13 @@ public class NumberUtil { /** * 比较两个字符是否相同 - * - * @param c1 字符1 - * @param c2 字符2 + * + * @param c1 字符1 + * @param c2 字符2 * @param ignoreCase 是否忽略大小写 * @return 是否相同 - * @since 3.2.1 * @see CharUtil#equals(char, char, boolean) + * @since 3.2.1 */ public static boolean equals(char c1, char c2, boolean ignoreCase) { return CharUtil.equals(c1, c2, ignoreCase); @@ -1682,25 +1686,24 @@ public class NumberUtil { /** * 取最小值 - * - * @param 元素类型 + * + * @param 元素类型 * @param numberArray 数字数组 * @return 最小值 - * @since 4.0.7 * @see ArrayUtil#min(Comparable[]) + * @since 4.0.7 */ - @SuppressWarnings("unchecked") - public static > T min(T... numberArray) { + public static > T min(T[] numberArray) { return ArrayUtil.min(numberArray); } /** * 取最小值 - * + * * @param numberArray 数字数组 * @return 最小值 - * @since 4.0.7 * @see ArrayUtil#min(long...) + * @since 4.0.7 */ public static long min(long... numberArray) { return ArrayUtil.min(numberArray); @@ -1708,11 +1711,11 @@ public class NumberUtil { /** * 取最小值 - * + * * @param numberArray 数字数组 * @return 最小值 - * @since 4.0.7 * @see ArrayUtil#min(int...) + * @since 4.0.7 */ public static int min(int... numberArray) { return ArrayUtil.min(numberArray); @@ -1720,11 +1723,11 @@ public class NumberUtil { /** * 取最小值 - * + * * @param numberArray 数字数组 * @return 最小值 - * @since 4.0.7 * @see ArrayUtil#min(short...) + * @since 4.0.7 */ public static short min(short... numberArray) { return ArrayUtil.min(numberArray); @@ -1732,11 +1735,11 @@ public class NumberUtil { /** * 取最小值 - * + * * @param numberArray 数字数组 * @return 最小值 - * @since 4.0.7 * @see ArrayUtil#min(double...) + * @since 4.0.7 */ public static double min(double... numberArray) { return ArrayUtil.min(numberArray); @@ -1744,11 +1747,11 @@ public class NumberUtil { /** * 取最小值 - * + * * @param numberArray 数字数组 * @return 最小值 - * @since 4.0.7 * @see ArrayUtil#min(float...) + * @since 4.0.7 */ public static float min(float... numberArray) { return ArrayUtil.min(numberArray); @@ -1756,25 +1759,24 @@ public class NumberUtil { /** * 取最大值 - * - * @param 元素类型 + * + * @param 元素类型 * @param numberArray 数字数组 * @return 最大值 - * @since 4.0.7 * @see ArrayUtil#max(Comparable[]) + * @since 4.0.7 */ - @SuppressWarnings("unchecked") - public static > T max(T... numberArray) { + public static > T max(T[] numberArray) { return ArrayUtil.max(numberArray); } /** * 取最大值 - * + * * @param numberArray 数字数组 * @return 最大值 - * @since 4.0.7 * @see ArrayUtil#max(long...) + * @since 4.0.7 */ public static long max(long... numberArray) { return ArrayUtil.max(numberArray); @@ -1782,11 +1784,11 @@ public class NumberUtil { /** * 取最大值 - * + * * @param numberArray 数字数组 * @return 最大值 - * @since 4.0.7 * @see ArrayUtil#max(int...) + * @since 4.0.7 */ public static int max(int... numberArray) { return ArrayUtil.max(numberArray); @@ -1794,11 +1796,11 @@ public class NumberUtil { /** * 取最大值 - * + * * @param numberArray 数字数组 * @return 最大值 - * @since 4.0.7 * @see ArrayUtil#max(short...) + * @since 4.0.7 */ public static short max(short... numberArray) { return ArrayUtil.max(numberArray); @@ -1806,11 +1808,11 @@ public class NumberUtil { /** * 取最大值 - * + * * @param numberArray 数字数组 * @return 最大值 - * @since 4.0.7 * @see ArrayUtil#max(double...) + * @since 4.0.7 */ public static double max(double... numberArray) { return ArrayUtil.max(numberArray); @@ -1818,11 +1820,11 @@ public class NumberUtil { /** * 取最大值 - * + * * @param numberArray 数字数组 * @return 最大值 - * @since 4.0.7 * @see ArrayUtil#max(float...) + * @since 4.0.7 */ public static float max(float... numberArray) { return ArrayUtil.max(numberArray); @@ -1832,7 +1834,7 @@ public class NumberUtil { * 数字转字符串
    * 调用{@link Number#toString()},并去除尾小数点儿后多余的0 * - * @param number A Number + * @param number A Number * @param defaultValue 如果number参数为{@code null},返回此默认值 * @return A String. * @since 3.0.9 @@ -1872,7 +1874,7 @@ public class NumberUtil { /** * 数字转{@link BigDecimal} - * + * * @param number 数字 * @return {@link BigDecimal} * @since 4.0.9 @@ -1886,7 +1888,7 @@ public class NumberUtil { /** * 数字转{@link BigDecimal} - * + * * @param number 数字 * @return {@link BigDecimal} * @since 4.0.9 @@ -1898,7 +1900,7 @@ public class NumberUtil { /** * 是否空白符
    * 空白符包括空格、制表符、全角空格和不间断空格
    - * + * * @param c 字符 * @return 是否空白符 * @see Character#isWhitespace(int) @@ -1914,11 +1916,11 @@ public class NumberUtil { /** * 是否空白符
    * 空白符包括空格、制表符、全角空格和不间断空格
    - * - * @see Character#isWhitespace(int) - * @see Character#isSpaceChar(int) + * * @param c 字符 * @return 是否空白符 + * @see Character#isWhitespace(int) + * @see Character#isSpaceChar(int) * @since 3.0.6 * @deprecated 请使用{@link CharUtil#isBlankChar(int)} */ @@ -1929,9 +1931,9 @@ public class NumberUtil { /** * 计算等份个数 - * + * * @param total 总数 - * @param part 每份的个数 + * @param part 每份的个数 * @return 分成了几份 * @since 3.0.6 */ @@ -1941,7 +1943,7 @@ public class NumberUtil { /** * 空转0 - * + * * @param decimal {@link BigDecimal},可以为{@code null} * @return {@link BigDecimal}参数为空时返回0的值 * @since 3.0.9 @@ -1953,7 +1955,7 @@ public class NumberUtil { /** * 如果给定值为0,返回1,否则返回原值 - * + * * @param value 值 * @return 1或非0值 * @since 3.1.2 @@ -1965,7 +1967,7 @@ public class NumberUtil { /** * 创建{@link BigInteger},支持16进制、10进制和8进制,如果传入空白串返回null
    * from Apache Common Lang - * + * * @param str 数字字符串 * @return {@link BigInteger} * @since 3.2.1 @@ -2007,7 +2009,7 @@ public class NumberUtil { /** * 判断两个数字是否相邻,例如1和2相邻,1和3不相邻
    * 判断方法为做差取绝对值判断是否为1 - * + * * @param number1 数字1 * @param number2 数字2 * @return 是否相邻 @@ -2020,7 +2022,7 @@ public class NumberUtil { /** * 判断两个数字是否相邻,例如1和2相邻,1和3不相邻
    * 判断方法为做差取绝对值判断是否为1 - * + * * @param number1 数字1 * @param number2 数字2 * @return 是否相邻 @@ -2033,8 +2035,8 @@ public class NumberUtil { /** * 把给定的总数平均分成N份,返回每份的个数
    * 当除以分数有余数时每份+1 - * - * @param total 总数 + * + * @param total 总数 * @param partCount 份数 * @return 每份的个数 * @since 4.0.7 @@ -2046,31 +2048,26 @@ public class NumberUtil { /** * 把给定的总数平均分成N份,返回每份的个数
    * 如果isPlusOneWhenHasRem为true,则当除以分数有余数时每份+1,否则丢弃余数部分 - * - * @param total 总数 - * @param partCount 份数 + * + * @param total 总数 + * @param partCount 份数 * @param isPlusOneWhenHasRem 在有余数时是否每份+1 * @return 每份的个数 * @since 4.0.7 */ public static int partValue(int total, int partCount, boolean isPlusOneWhenHasRem) { - int partValue; - if (total % partCount == 0) { - partValue = total / partCount; - } else { - partValue = (int) Math.floor(total / partCount); - if (isPlusOneWhenHasRem) { - partValue += 1; - } + int partValue = total / partCount; + if (isPlusOneWhenHasRem && total % partCount == 0) { + partValue++; } return partValue; } /** * 提供精确的幂运算 - * + * * @param number 底数 - * @param n 指数 + * @param n 指数 * @return 幂的积 * @since 4.1.0 */ @@ -2080,9 +2077,9 @@ public class NumberUtil { /** * 提供精确的幂运算 - * + * * @param number 底数 - * @param n 指数 + * @param n 指数 * @return 幂的积 * @since 4.1.0 */ @@ -2092,7 +2089,7 @@ public class NumberUtil { /** * 解析转换数字字符串为int型数字,规则如下: - * + * *
     	 * 1、0x开头的视为16进制数字
     	 * 2、0开头的视为8进制数字
    @@ -2101,7 +2098,7 @@ public class NumberUtil {
     	 * 5、.123形式返回0(按照小于0的小数对待)
     	 * 6、123.56截取小数点之前的数字,忽略小数部分
     	 * 
    - * + * * @param number 数字,支持0x开头、0开头和普通十进制 * @return int * @throws NumberFormatException 数字格式异常 @@ -2128,14 +2125,14 @@ public class NumberUtil { /** * 解析转换数字字符串为long型数字,规则如下: - * + * *
     	 * 1、0x开头的视为16进制数字
     	 * 2、0开头的视为8进制数字
     	 * 3、空串返回0
     	 * 4、其它情况按照10进制转换
     	 * 
    - * + * * @param number 数字,支持0x开头、0开头和普通十进制 * @return long * @since 4.1.4 @@ -2161,7 +2158,7 @@ public class NumberUtil { /** * 将指定字符串转换为{@link Number} 对象 - * + * * @param numberStr Number字符串 * @return Number对象 * @since 4.1.15 @@ -2178,7 +2175,7 @@ public class NumberUtil { /** * int值转byte数组,使用大端字节序(高位字节在前,低位字节在后)
    * 见:http://www.ruanyifeng.com/blog/2016/11/byte-order.html - * + * * @param value 值 * @return byte数组 * @since 4.4.5 @@ -2197,7 +2194,7 @@ public class NumberUtil { /** * byte数组转int,使用大端字节序(高位字节在前,低位字节在后)
    * 见:http://www.ruanyifeng.com/blog/2016/11/byte-order.html - * + * * @param bytes byte数组 * @return int * @since 4.4.5 @@ -2211,7 +2208,7 @@ public class NumberUtil { /** * 以无符号字节数组的形式返回传入值。 - * + * * @param value 需要转换的值 * @return 无符号bytes * @since 4.5.0 @@ -2231,9 +2228,9 @@ public class NumberUtil { /** * 以无符号字节数组的形式返回传入值。 - * + * * @param length bytes长度 - * @param value 需要转换的值 + * @param value 需要转换的值 * @return 无符号bytes * @since 4.5.0 */ @@ -2257,7 +2254,7 @@ public class NumberUtil { /** * 无符号bytes转{@link BigInteger} - * + * * @param buf buf 无符号bytes * @return {@link BigInteger} * @since 4.5.0 @@ -2268,9 +2265,9 @@ public class NumberUtil { /** * 无符号bytes转{@link BigInteger} - * - * @param buf 无符号bytes - * @param off 起始位置 + * + * @param buf 无符号bytes + * @param off 起始位置 * @param length 长度 * @return {@link BigInteger} */ @@ -2320,7 +2317,7 @@ public class NumberUtil { /** * 去掉数字尾部的数字标识,例如12D,44.0F,22L中的最后一个字母 - * + * * @param number 数字字符串 * @return 去掉标识的字符串 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java index ced85ad02..aafd0b7a5 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java @@ -184,6 +184,7 @@ public class ObjectUtil { * @return 是否为null */ public static boolean isNull(Object obj) { + //noinspection ConstantConditions return null == obj || obj.equals(null); } @@ -194,6 +195,7 @@ public class ObjectUtil { * @return 是否为null */ public static boolean isNotNull(Object obj) { + //noinspection ConstantConditions return null != obj && false == obj.equals(null); } 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 fda651f73..309c3de3a 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 @@ -191,13 +191,13 @@ public class NumberUtilTest { @Test public void maxTest() { - int max = NumberUtil.max(new int[]{5,4,3,6,1}); + int max = NumberUtil.max(5,4,3,6,1); Assert.assertEquals(6, max); } @Test public void minTest() { - int min = NumberUtil.min(new int[]{5,4,3,6,1}); + int min = NumberUtil.min(5,4,3,6,1); Assert.assertEquals(1, min); } diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ftp/AbstractFtp.java b/hutool-extra/src/main/java/cn/hutool/extra/ftp/AbstractFtp.java index 20377d7d3..ff605b0a2 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/ftp/AbstractFtp.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/ftp/AbstractFtp.java @@ -133,13 +133,14 @@ public abstract class AbstractFtp implements Closeable { } /** - * 将本地文件上传到目标服务器,目标文件名为destPath,若destPath为目录,则目标文件名将与srcFilePath文件名相同。覆盖模式 + * 将本地文件上传到目标服务器,目标文件名为destPath,若destPath为目录,则目标文件名将与file文件名相同。 + * 覆盖模式 * - * @param srcFilePath 本地文件路径 - * @param destFile 目标文件 + * @param destPath 服务端路径,可以为{@code null} 或者相对路径或绝对路径 + * @param file 需要上传的文件 * @return 是否成功 */ - public abstract boolean upload(String srcFilePath, File destFile); + public abstract boolean upload(String destPath, File file); /** * 下载文件 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ftp/Ftp.java b/hutool-extra/src/main/java/cn/hutool/extra/ftp/Ftp.java index 25d613f9e..12afd4dff 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/ftp/Ftp.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/ftp/Ftp.java @@ -364,14 +364,14 @@ public class Ftp extends AbstractFtp { * 3. path为绝对路径则上传到此路径 * * - * @param path 服务端路径,可以为{@code null} 或者相对路径或绝对路径 + * @param destPath 服务端路径,可以为{@code null} 或者相对路径或绝对路径 * @param file 文件 * @return 是否上传成功 */ @Override - public boolean upload(String path, File file) { + public boolean upload(String destPath, File file) { Assert.notNull(file, "file to upload is null !"); - return upload(path, file.getName(), file); + return upload(destPath, file.getName(), file); } /** diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java index e777193dc..97b33fad0 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java @@ -238,9 +238,6 @@ public class JschUtil { */ public static int openAndBindPortToLocal(Connector sshConn, String remoteHost, int remotePort) throws JschRuntimeException { final Session session = openSession(sshConn.getHost(), sshConn.getPort(), sshConn.getUser(), sshConn.getPassword()); - if (session == null) { - throw new JschRuntimeException("Error to create SSH Session!"); - } final int localPort = generateLocalPort(); bindPort(session, remoteHost, remotePort, localPort); return localPort; @@ -359,7 +356,7 @@ public class JschUtil { if (null == charset) { charset = CharsetUtil.CHARSET_UTF_8; } - ChannelExec channel = (ChannelExec) openChannel(session, ChannelType.EXEC); + final ChannelExec channel = (ChannelExec) openChannel(session, ChannelType.EXEC); channel.setCommand(StrUtil.bytes(cmd, charset)); channel.setInputStream(null); channel.setErrStream(errStream); diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java b/hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java index 532028402..7565a6892 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/ssh/Sftp.java @@ -1,12 +1,9 @@ package cn.hutool.extra.ssh; -import java.io.File; -import java.io.IOException; -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.List; -import java.util.Vector; - +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.lang.Filter; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.ftp.AbstractFtp; import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.ChannelSftp.LsEntry; import com.jcraft.jsch.ChannelSftp.LsEntrySelector; @@ -14,10 +11,11 @@ import com.jcraft.jsch.Session; import com.jcraft.jsch.SftpException; import com.jcraft.jsch.SftpProgressMonitor; -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.lang.Filter; -import cn.hutool.core.util.StrUtil; -import cn.hutool.extra.ftp.AbstractFtp; +import java.io.File; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.List; +import java.util.Vector; /** * SFTP是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。
    @@ -336,8 +334,8 @@ public class Sftp extends AbstractFtp { } @Override - public boolean upload(String srcFilePath, File destFile) { - put(srcFilePath, FileUtil.getAbsolutePath(destFile)); + public boolean upload(String destPath, File file) { + put(FileUtil.getAbsolutePath(file), destPath); return true; } diff --git a/hutool-system/src/main/java/cn/hutool/system/RuntimeInfo.java b/hutool-system/src/main/java/cn/hutool/system/RuntimeInfo.java index 63c40b427..ef6b380a3 100644 --- a/hutool-system/src/main/java/cn/hutool/system/RuntimeInfo.java +++ b/hutool-system/src/main/java/cn/hutool/system/RuntimeInfo.java @@ -23,8 +23,8 @@ public class RuntimeInfo implements Serializable{ } /** - * 获得JVM最大可用内存 - * @return 最大可用内存 + * 获得JVM最大内存 + * @return 最大内存 */ public final long getMaxMemory(){ return currentRuntime.maxMemory(); From edb8b1ff8cdd65242b57f9a5de4de16d5b320970 Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 20 Nov 2019 23:17:45 +0800 Subject: [PATCH 03/17] add test --- .../src/test/java/cn/hutool/core/util/NumberUtilTest.java | 3 +++ 1 file changed, 3 insertions(+) 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 309c3de3a..75b63e254 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 @@ -215,6 +215,9 @@ public class NumberUtilTest { Assert.assertEquals(10, v5); int v6 = NumberUtil.parseInt("22.4D"); Assert.assertEquals(22, v6); + + int v7 = NumberUtil.parseInt("0"); + Assert.assertEquals(0, v7); } @Test From c4740a2c6b08ff538729bc2f501db9897972dd11 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 22 Nov 2019 07:29:07 +0800 Subject: [PATCH 04/17] fix code --- .../java/cn/hutool/captcha/CaptchaTest.java | 1 - .../main/java/cn/hutool/db/sql/SqlUtil.java | 4 +- .../src/test/java/cn/hutool/db/DbTest.java | 39 ++++++++++++------- .../src/test/java/cn/hutool/db/MySQLTest.java | 6 +-- 4 files changed, 28 insertions(+), 22 deletions(-) diff --git a/hutool-captcha/src/test/java/cn/hutool/captcha/CaptchaTest.java b/hutool-captcha/src/test/java/cn/hutool/captcha/CaptchaTest.java index 3d3a99190..6b9d1cb31 100644 --- a/hutool-captcha/src/test/java/cn/hutool/captcha/CaptchaTest.java +++ b/hutool-captcha/src/test/java/cn/hutool/captcha/CaptchaTest.java @@ -93,7 +93,6 @@ public class CaptchaTest { @Test @Ignore public void ShearCaptchaWithMathTest() { - // 定义图形验证码的长和宽 ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(200, 45, 4, 4); captcha.setGenerator(new MathGenerator()); diff --git a/hutool-db/src/main/java/cn/hutool/db/sql/SqlUtil.java b/hutool-db/src/main/java/cn/hutool/db/sql/SqlUtil.java index 65f49d7ec..471fc182c 100644 --- a/hutool-db/src/main/java/cn/hutool/db/sql/SqlUtil.java +++ b/hutool-db/src/main/java/cn/hutool/db/sql/SqlUtil.java @@ -111,10 +111,10 @@ public class SqlUtil { StringBuilder likeValue = StrUtil.builder(withLikeKeyword ? "LIKE " : ""); switch (likeType) { case StartWith: - likeValue.append('%').append(value); + likeValue.append(value).append('%'); break; case EndWith: - likeValue.append(value).append('%'); + likeValue.append('%').append(value); break; case Contains: likeValue.append('%').append(value).append('%'); 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 fb5318c51..d31ddac1d 100644 --- a/hutool-db/src/test/java/cn/hutool/db/DbTest.java +++ b/hutool-db/src/test/java/cn/hutool/db/DbTest.java @@ -1,15 +1,13 @@ package cn.hutool.db; -import java.sql.SQLException; -import java.util.List; - +import cn.hutool.db.sql.Condition; +import cn.hutool.log.StaticLog; import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; -import cn.hutool.core.lang.func.VoidFunc1; -import cn.hutool.db.sql.Condition; -import cn.hutool.log.StaticLog; +import java.sql.SQLException; +import java.util.List; /** * Db对象单元测试 @@ -29,7 +27,22 @@ public class DbTest { List find = Db.use().find(Entity.create("user").set("age", 18)); Assert.assertEquals("王五", find.get(0).get("name")); } - + + @Test + public void findLikeTest() throws SQLException { + // 方式1 + List find = Db.use().find(Entity.create("user").set("name", "like 王%")); + Assert.assertEquals("王五", find.get(0).get("name")); + + // 方式2 + find = Db.use().findLike("user", "name", "王", Condition.LikeType.StartWith); + Assert.assertEquals("王五", find.get(0).get("name")); + + // 方式3 + find = Db.use().query("select * from user where name like ?", "王%"); + Assert.assertEquals("王五", find.get(0).get("name")); + } + @Test public void findByTest() throws SQLException { List find = Db.use().findBy("user", @@ -45,14 +58,10 @@ public class DbTest { @Test @Ignore public void txTest() throws SQLException { - Db.use().tx(new VoidFunc1() { - - @Override - public void call(Db db) throws SQLException { - db.insert(Entity.create("user").set("name", "unitTestUser2")); - db.update(Entity.create().set("age", 79), Entity.create("user").set("name", "unitTestUser2")); - db.del("user", "name", "unitTestUser2"); - } + Db.use().tx(db -> { + db.insert(Entity.create("user").set("name", "unitTestUser2")); + db.update(Entity.create().set("age", 79), Entity.create("user").set("name", "unitTestUser2")); + db.del("user", "name", "unitTestUser2"); }); } } 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 c65140c32..ab90ffb6f 100644 --- a/hutool-db/src/test/java/cn/hutool/db/MySQLTest.java +++ b/hutool-db/src/test/java/cn/hutool/db/MySQLTest.java @@ -1,12 +1,10 @@ package cn.hutool.db; -import java.sql.SQLException; - +import cn.hutool.core.lang.Console; import org.junit.Ignore; import org.junit.Test; -import cn.hutool.core.lang.Console; -import cn.hutool.core.lang.func.VoidFunc1; +import java.sql.SQLException; /** * MySQL操作单元测试 From de80af155cc79d8356bd16e8483d96d8d76b181c Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 22 Nov 2019 07:58:48 +0800 Subject: [PATCH 05/17] fix bug --- CHANGELOG.md | 2 + .../main/java/cn/hutool/extra/mail/Mail.java | 13 +- .../java/cn/hutool/extra/mail/MailUtil.java | 344 ++++++++++-------- .../java/cn/hutool/extra/mail/MailTest.java | 2 +- 4 files changed, 194 insertions(+), 167 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 589e2e735..9285dd1e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,9 +8,11 @@ ### 新特性 * 【core 】 解决NumberUtil导致的ambiguous问题(issue#630@Github) * 【core 】 BeanUtil.isEmpty()忽略字段支持,增加isNotEmpty(issue#629@Github) +* 【extra 】 邮件发送后获取message-id(issue#I15FKR@Gitee) ### Bug修复 * 【extra】 修复SFTP.upload上传失败的问题 +* 【db】 修复findLike匹配错误问题 ------------------------------------------------------------------------------------------------------------- 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 4c9382f85..d3d2284a5 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 @@ -349,10 +349,10 @@ public class Mail { /** * 发送 * - * @return this + * @return message-id * @throws MailException 邮件发送异常 */ - public Mail send() throws MailException { + public String send() throws MailException { try { return doSend(); } catch (MessagingException e) { @@ -365,12 +365,13 @@ public class Mail { /** * 执行发送 * - * @return this + * @return message-id * @throws MessagingException 发送异常 */ - private Mail doSend() throws MessagingException { - Transport.send(buildMsg()); - return this; + private String doSend() throws MessagingException { + final MimeMessage mimeMessage = buildMsg(); + Transport.send(mimeMessage); + return mimeMessage.getMessageID(); } /** 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 d4fe5f873..adfd5bed0 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 @@ -14,7 +14,7 @@ import cn.hutool.core.util.StrUtil; /** * 邮件工具类,基于javax.mail封装 - * + * * @author looly * @since 3.1.2 */ @@ -23,325 +23,349 @@ public class MailUtil { * 使用配置文件中设置的账户发送文本邮件,发送给单个或多个收件人
    * 多个收件人可以使用逗号“,”分隔,也可以通过分号“;”分隔 * - * @param to 收件人 + * @param to 收件人 * @param subject 标题 * @param content 正文 - * @param files 附件列表 + * @param files 附件列表 + * @return message-id * @since 3.2.0 */ - public static void sendText(String to, String subject, String content, File... files) { - send(to, subject, content, false, files); + public static String sendText(String to, String subject, String content, File... files) { + return send(to, subject, content, false, files); } /** * 使用配置文件中设置的账户发送HTML邮件,发送给单个或多个收件人
    * 多个收件人可以使用逗号“,”分隔,也可以通过分号“;”分隔 * - * @param to 收件人 + * @param to 收件人 * @param subject 标题 * @param content 正文 - * @param files 附件列表 + * @param files 附件列表 + * @return message-id * @since 3.2.0 */ - public static void sendHtml(String to, String subject, String content, File... files) { - send(to, subject, content, true, files); + public static String sendHtml(String to, String subject, String content, File... files) { + return send(to, subject, content, true, files); } /** * 使用配置文件中设置的账户发送邮件,发送单个或多个收件人
    * 多个收件人可以使用逗号“,”分隔,也可以通过分号“;”分隔 * - * @param to 收件人 + * @param to 收件人 * @param subject 标题 * @param content 正文 - * @param isHtml 是否为HTML - * @param files 附件列表 + * @param isHtml 是否为HTML + * @param files 附件列表 + * @return message-id */ - public static void send(String to, String subject, String content, boolean isHtml, File... files) { - send(splitAddress(to), subject, content, isHtml, files); + public static String send(String to, String subject, String content, boolean isHtml, File... files) { + return send(splitAddress(to), subject, content, isHtml, files); } /** * 使用配置文件中设置的账户发送邮件,发送单个或多个收件人
    * 多个收件人、抄送人、密送人可以使用逗号“,”分隔,也可以通过分号“;”分隔 * - * @param to 收件人,可以使用逗号“,”分隔,也可以通过分号“;”分隔 - * @param cc 抄送人,可以使用逗号“,”分隔,也可以通过分号“;”分隔 - * @param bcc 密送人,可以使用逗号“,”分隔,也可以通过分号“;”分隔 + * @param to 收件人,可以使用逗号“,”分隔,也可以通过分号“;”分隔 + * @param cc 抄送人,可以使用逗号“,”分隔,也可以通过分号“;”分隔 + * @param bcc 密送人,可以使用逗号“,”分隔,也可以通过分号“;”分隔 * @param subject 标题 * @param content 正文 - * @param isHtml 是否为HTML - * @param files 附件列表 + * @param isHtml 是否为HTML + * @param files 附件列表 + * @return message-id * @since 4.0.3 */ - public static void send(String to, String cc, String bcc, String subject, String content, boolean isHtml, File... files) { - send(splitAddress(to), splitAddress(cc), splitAddress(bcc), subject, content, isHtml, files); + public static String send(String to, String cc, String bcc, String subject, String content, boolean isHtml, File... files) { + return send(splitAddress(to), splitAddress(cc), splitAddress(bcc), subject, content, isHtml, files); } /** * 使用配置文件中设置的账户发送文本邮件,发送给多人 * - * @param tos 收件人列表 + * @param tos 收件人列表 * @param subject 标题 * @param content 正文 - * @param files 附件列表 + * @param files 附件列表 + * @return message-id */ - public static void sendText(Collection tos, String subject, String content, File... files) { - send(tos, subject, content, false, files); + public static String sendText(Collection tos, String subject, String content, File... files) { + return send(tos, subject, content, false, files); } /** * 使用配置文件中设置的账户发送HTML邮件,发送给多人 * - * @param tos 收件人列表 + * @param tos 收件人列表 * @param subject 标题 * @param content 正文 - * @param files 附件列表 + * @param files 附件列表 + * @return message-id * @since 3.2.0 */ - public static void sendHtml(Collection tos, String subject, String content, File... files) { - send(tos, subject, content, true, files); + public static String sendHtml(Collection tos, String subject, String content, File... files) { + return send(tos, subject, content, true, files); } /** * 使用配置文件中设置的账户发送邮件,发送给多人 * - * @param tos 收件人列表 + * @param tos 收件人列表 * @param subject 标题 * @param content 正文 - * @param isHtml 是否为HTML - * @param files 附件列表 + * @param isHtml 是否为HTML + * @param files 附件列表 + * @return message-id */ - public static void send(Collection tos, String subject, String content, boolean isHtml, File... files) { - send(tos, null, null, subject, content, isHtml, files); + public static String send(Collection tos, String subject, String content, boolean isHtml, File... files) { + return send(tos, null, null, subject, content, isHtml, files); } /** * 使用配置文件中设置的账户发送邮件,发送给多人 * - * @param tos 收件人列表 - * @param ccs 抄送人列表,可以为null或空 - * @param bccs 密送人列表,可以为null或空 + * @param tos 收件人列表 + * @param ccs 抄送人列表,可以为null或空 + * @param bccs 密送人列表,可以为null或空 * @param subject 标题 * @param content 正文 - * @param isHtml 是否为HTML - * @param files 附件列表 + * @param isHtml 是否为HTML + * @param files 附件列表 + * @return message-id * @since 4.0.3 */ - public static void send(Collection tos, Collection ccs, Collection bccs, String subject, String content, boolean isHtml, File... files) { - send(GlobalMailAccount.INSTANCE.getAccount(), true, tos, ccs, bccs, subject, content, null, isHtml, files); + public static String send(Collection tos, Collection ccs, Collection bccs, String subject, String content, boolean isHtml, File... files) { + return send(GlobalMailAccount.INSTANCE.getAccount(), true, tos, ccs, bccs, subject, content, null, isHtml, files); } // ------------------------------------------------------------------------------------------------------------------------------- Custom MailAccount + /** * 发送邮件给多人 * * @param mailAccount 邮件认证对象 - * @param to 收件人,多个收件人逗号或者分号隔开 - * @param subject 标题 - * @param content 正文 - * @param isHtml 是否为HTML格式 - * @param files 附件列表 + * @param to 收件人,多个收件人逗号或者分号隔开 + * @param subject 标题 + * @param content 正文 + * @param isHtml 是否为HTML格式 + * @param files 附件列表 + * @return message-id * @since 3.2.0 */ - public static void send(MailAccount mailAccount, String to, String subject, String content, boolean isHtml, File... files) { - send(mailAccount, splitAddress(to), subject, content, isHtml, files); + public static String send(MailAccount mailAccount, String to, String subject, String content, boolean isHtml, File... files) { + return send(mailAccount, splitAddress(to), subject, content, isHtml, files); } /** * 发送邮件给多人 * * @param mailAccount 邮件帐户信息 - * @param tos 收件人列表 - * @param subject 标题 - * @param content 正文 - * @param isHtml 是否为HTML格式 - * @param files 附件列表 + * @param tos 收件人列表 + * @param subject 标题 + * @param content 正文 + * @param isHtml 是否为HTML格式 + * @param files 附件列表 + * @return message-id */ - public static void send(MailAccount mailAccount, Collection tos, String subject, String content, boolean isHtml, File... files) { - send(mailAccount, tos, null, null, subject, content, isHtml, files); + public static String send(MailAccount mailAccount, Collection tos, String subject, String content, boolean isHtml, File... files) { + return send(mailAccount, tos, null, null, subject, content, isHtml, files); } /** * 发送邮件给多人 * * @param mailAccount 邮件帐户信息 - * @param tos 收件人列表 - * @param ccs 抄送人列表,可以为null或空 - * @param bccs 密送人列表,可以为null或空 - * @param subject 标题 - * @param content 正文 - * @param isHtml 是否为HTML格式 - * @param files 附件列表 + * @param tos 收件人列表 + * @param ccs 抄送人列表,可以为null或空 + * @param bccs 密送人列表,可以为null或空 + * @param subject 标题 + * @param content 正文 + * @param isHtml 是否为HTML格式 + * @param files 附件列表 + * @return message-id * @since 4.0.3 */ - public static void send(MailAccount mailAccount, Collection tos, Collection ccs, Collection bccs, String subject, String content, boolean isHtml, File... files) { - send(mailAccount, false, tos, ccs, bccs, subject, content, null, isHtml, files); + public static String send(MailAccount mailAccount, Collection tos, Collection ccs, Collection bccs, String subject, String content, boolean isHtml, File... files) { + return send(mailAccount, false, tos, ccs, bccs, subject, content, null, isHtml, files); } /** * 使用配置文件中设置的账户发送HTML邮件,发送给单个或多个收件人
    * 多个收件人可以使用逗号“,”分隔,也可以通过分号“;”分隔 - * - * @param to 收件人 - * @param subject 标题 - * @param content 正文 - * @param files 附件列表 + * + * @param to 收件人 + * @param subject 标题 + * @param content 正文 * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER + * @param files 附件列表 + * @return message-id * @since 3.2.0 */ - public static void sendHtml(String to, String subject, String content, Map imageMap, File... files) { - send(to, subject, content, imageMap, true, files); + public static String sendHtml(String to, String subject, String content, Map imageMap, File... files) { + return send(to, subject, content, imageMap, true, files); } /** * 使用配置文件中设置的账户发送邮件,发送单个或多个收件人
    * 多个收件人可以使用逗号“,”分隔,也可以通过分号“;”分隔 - * - * @param to 收件人 - * @param subject 标题 - * @param content 正文 + * + * @param to 收件人 + * @param subject 标题 + * @param content 正文 * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER - * @param isHtml 是否为HTML - * @param files 附件列表 + * @param isHtml 是否为HTML + * @param files 附件列表 + * @return message-id */ - public static void send(String to, String subject, String content, Map imageMap, boolean isHtml, File... files) { - send(splitAddress(to), subject, content, imageMap, isHtml, files); + public static String send(String to, String subject, String content, Map imageMap, boolean isHtml, File... files) { + return send(splitAddress(to), subject, content, imageMap, isHtml, files); } /** * 使用配置文件中设置的账户发送邮件,发送单个或多个收件人
    * 多个收件人、抄送人、密送人可以使用逗号“,”分隔,也可以通过分号“;”分隔 - * - * @param to 收件人,可以使用逗号“,”分隔,也可以通过分号“;”分隔 - * @param cc 抄送人,可以使用逗号“,”分隔,也可以通过分号“;”分隔 - * @param bcc 密送人,可以使用逗号“,”分隔,也可以通过分号“;”分隔 - * @param subject 标题 - * @param content 正文 + * + * @param to 收件人,可以使用逗号“,”分隔,也可以通过分号“;”分隔 + * @param cc 抄送人,可以使用逗号“,”分隔,也可以通过分号“;”分隔 + * @param bcc 密送人,可以使用逗号“,”分隔,也可以通过分号“;”分隔 + * @param subject 标题 + * @param content 正文 * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER - * @param isHtml 是否为HTML - * @param files 附件列表 + * @param isHtml 是否为HTML + * @param files 附件列表 + * @return message-id * @since 4.0.3 */ - public static void send(String to, String cc, String bcc, String subject, String content, Map imageMap, boolean isHtml, File... files) { - send(splitAddress(to), splitAddress(cc), splitAddress(bcc), subject, content, imageMap, isHtml, files); + public static String send(String to, String cc, String bcc, String subject, String content, Map imageMap, boolean isHtml, File... files) { + return send(splitAddress(to), splitAddress(cc), splitAddress(bcc), subject, content, imageMap, isHtml, files); } /** * 使用配置文件中设置的账户发送HTML邮件,发送给多人 - * - * @param tos 收件人列表 - * @param subject 标题 - * @param content 正文 + * + * @param tos 收件人列表 + * @param subject 标题 + * @param content 正文 * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER - * @param files 附件列表 + * @param files 附件列表 + * @return message-id * @since 3.2.0 */ - public static void sendHtml(Collection tos, String subject, String content, Map imageMap, File... files) { - send(tos, subject, content, imageMap, true, files); + public static String sendHtml(Collection tos, String subject, String content, Map imageMap, File... files) { + return send(tos, subject, content, imageMap, true, files); } /** * 使用配置文件中设置的账户发送邮件,发送给多人 - * - * @param tos 收件人列表 - * @param subject 标题 - * @param content 正文 + * + * @param tos 收件人列表 + * @param subject 标题 + * @param content 正文 * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER - * @param isHtml 是否为HTML - * @param files 附件列表 + * @param isHtml 是否为HTML + * @param files 附件列表 + * @return message-id */ - public static void send(Collection tos, String subject, String content, Map imageMap, boolean isHtml, File... files) { - send(tos, null, null, subject, content, imageMap, isHtml, files); + public static String send(Collection tos, String subject, String content, Map imageMap, boolean isHtml, File... files) { + return send(tos, null, null, subject, content, imageMap, isHtml, files); } /** * 使用配置文件中设置的账户发送邮件,发送给多人 - * - * @param tos 收件人列表 - * @param ccs 抄送人列表,可以为null或空 - * @param bccs 密送人列表,可以为null或空 - * @param subject 标题 - * @param content 正文 + * + * @param tos 收件人列表 + * @param ccs 抄送人列表,可以为null或空 + * @param bccs 密送人列表,可以为null或空 + * @param subject 标题 + * @param content 正文 * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER - * @param isHtml 是否为HTML - * @param files 附件列表 + * @param isHtml 是否为HTML + * @param files 附件列表 + * @return message-id * @since 4.0.3 */ - public static void send(Collection tos, Collection ccs, Collection bccs, String subject, String content, Map imageMap, boolean isHtml, File... files) { - send(GlobalMailAccount.INSTANCE.getAccount(), true, tos, ccs, bccs, subject, content, imageMap, isHtml, files); + public static String send(Collection tos, Collection ccs, Collection bccs, String subject, String content, Map imageMap, boolean isHtml, File... files) { + return send(GlobalMailAccount.INSTANCE.getAccount(), true, tos, ccs, bccs, subject, content, imageMap, isHtml, files); } // ------------------------------------------------------------------------------------------------------------------------------- Custom MailAccount + /** * 发送邮件给多人 - * + * * @param mailAccount 邮件认证对象 - * @param to 收件人,多个收件人逗号或者分号隔开 - * @param subject 标题 - * @param content 正文 - * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER - * @param isHtml 是否为HTML格式 - * @param files 附件列表 + * @param to 收件人,多个收件人逗号或者分号隔开 + * @param subject 标题 + * @param content 正文 + * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER + * @param isHtml 是否为HTML格式 + * @param files 附件列表 + * @return message-id * @since 3.2.0 */ - public static void send(MailAccount mailAccount, String to, String subject, String content, Map imageMap, boolean isHtml, File... files) { - send(mailAccount, splitAddress(to), subject, content, imageMap, isHtml, files); + public static String send(MailAccount mailAccount, String to, String subject, String content, Map imageMap, boolean isHtml, File... files) { + return send(mailAccount, splitAddress(to), subject, content, imageMap, isHtml, files); } /** * 发送邮件给多人 - * + * * @param mailAccount 邮件帐户信息 - * @param tos 收件人列表 - * @param subject 标题 - * @param content 正文 - * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER - * @param isHtml 是否为HTML格式 - * @param files 附件列表 + * @param tos 收件人列表 + * @param subject 标题 + * @param content 正文 + * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER + * @param isHtml 是否为HTML格式 + * @param files 附件列表 + * @return message-id * @since 4.6.3 */ - public static void send(MailAccount mailAccount, Collection tos, String subject, String content, Map imageMap, boolean isHtml, File... files) { - send(mailAccount, tos, null, null, subject, content, imageMap, isHtml, files); + public static String send(MailAccount mailAccount, Collection tos, String subject, String content, Map imageMap, boolean isHtml, File... files) { + return send(mailAccount, tos, null, null, subject, content, imageMap, isHtml, files); } /** * 发送邮件给多人 - * + * * @param mailAccount 邮件帐户信息 - * @param tos 收件人列表 - * @param ccs 抄送人列表,可以为null或空 - * @param bccs 密送人列表,可以为null或空 - * @param subject 标题 - * @param content 正文 - * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER - * @param isHtml 是否为HTML格式 - * @param files 附件列表 + * @param tos 收件人列表 + * @param ccs 抄送人列表,可以为null或空 + * @param bccs 密送人列表,可以为null或空 + * @param subject 标题 + * @param content 正文 + * @param imageMap 图片与占位符,占位符格式为cid:$IMAGE_PLACEHOLDER + * @param isHtml 是否为HTML格式 + * @param files 附件列表 + * @return message-id * @since 4.6.3 */ - public static void send(MailAccount mailAccount, Collection tos, Collection ccs, Collection bccs, String subject, String content, Map imageMap, - boolean isHtml, File... files) { - send(mailAccount, false, tos, ccs, bccs, subject, content, imageMap, isHtml, files); + public static String send(MailAccount mailAccount, Collection tos, Collection ccs, Collection bccs, String subject, String content, Map imageMap, + boolean isHtml, File... files) { + return send(mailAccount, false, tos, ccs, bccs, subject, content, imageMap, isHtml, files); } // ------------------------------------------------------------------------------------------------------------------------ Private method start + /** * 发送邮件给多人 - * - * @param mailAccount 邮件帐户信息 + * + * @param mailAccount 邮件帐户信息 * @param useGlobalSession 是否全局共享Session - * @param tos 收件人列表 - * @param ccs 抄送人列表,可以为null或空 - * @param bccs 密送人列表,可以为null或空 - * @param subject 标题 - * @param content 正文 - * @param imageMap 图片与占位符,占位符格式为cid:${cid} - * @param isHtml 是否为HTML格式 - * @param files 附件列表 + * @param tos 收件人列表 + * @param ccs 抄送人列表,可以为null或空 + * @param bccs 密送人列表,可以为null或空 + * @param subject 标题 + * @param content 正文 + * @param imageMap 图片与占位符,占位符格式为cid:${cid} + * @param isHtml 是否为HTML格式 + * @param files 附件列表 + * @return message-id * @since 4.6.3 */ - private static void send(MailAccount mailAccount, boolean useGlobalSession, Collection tos, Collection ccs, Collection bccs, String subject, String content, - Map imageMap, boolean isHtml, File... files) { + private static String send(MailAccount mailAccount, boolean useGlobalSession, Collection tos, Collection ccs, Collection bccs, String subject, String content, + Map imageMap, boolean isHtml, File... files) { final Mail mail = Mail.create(mailAccount).setUseGlobalSession(useGlobalSession); // 可选抄送人 @@ -358,9 +382,9 @@ public class MailUtil { mail.setContent(content); mail.setHtml(isHtml); mail.setFiles(files); - + // 图片 - if(MapUtil.isNotEmpty(imageMap)) { + if (MapUtil.isNotEmpty(imageMap)) { for (Entry entry : imageMap.entrySet()) { mail.addImage(entry.getKey(), entry.getValue()); // 关闭流 @@ -368,12 +392,12 @@ public class MailUtil { } } - mail.send(); + return mail.send(); } /** * 将多个联系人转为列表,分隔符为逗号或者分号 - * + * * @param addresses 多个联系人,如果为空返回null * @return 联系人列表 */ 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 998bed40f..bb7c166ec 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 @@ -40,7 +40,7 @@ public class MailTest { } @Test - @Ignore +// @Ignore public void sendHtmlTest() { MailUtil.send("hutool@foxmail.com", "测试", "

    邮件来自Hutool测试

    ", true); } From 83460af7ef883d5a370662b86d2b0f1274d63cf8 Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 26 Nov 2019 11:21:34 +0800 Subject: [PATCH 06/17] fix bug --- CHANGELOG.md | 5 +- .../java/cn/hutool/core/convert/Convert.java | 32 +++++++++++- .../OptNullBasicTypeFromObjectGetter.java | 50 +++++++------------ .../OptNullBasicTypeFromStringGetter.java | 41 ++++++--------- .../core/getter/OptNullBasicTypeGetter.java | 48 +++++++----------- .../src/main/java/cn/hutool/core/img/Img.java | 29 ++++++++--- .../main/java/cn/hutool/core/img/ImgUtil.java | 13 +++-- .../hutool/core/map/CamelCaseLinkedMap.java | 2 +- .../java/cn/hutool/core/map/CamelCaseMap.java | 4 +- .../core/map/CaseInsensitiveLinkedMap.java | 2 +- .../java/cn/hutool/core/map/MapProxy.java | 10 ++-- .../java/cn/hutool/core/map/MapWrapper.java | 19 +++++-- .../java/cn/hutool/core/util/XmlUtil.java | 8 ++- .../java/cn/hutool/core/util/XmlUtilTest.java | 22 +++++--- .../main/java/cn/hutool/json/JSONArray.java | 18 +++++-- .../main/java/cn/hutool/json/JSONGetter.java | 18 +++---- .../main/java/cn/hutool/json/JSONObject.java | 9 ++-- .../java/cn/hutool/setting/AbsSetting.java | 2 +- 18 files changed, 192 insertions(+), 140 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9285dd1e4..b4a3a1a9c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,11 +8,14 @@ ### 新特性 * 【core 】 解决NumberUtil导致的ambiguous问题(issue#630@Github) * 【core 】 BeanUtil.isEmpty()忽略字段支持,增加isNotEmpty(issue#629@Github) -* 【extra 】 邮件发送后获取message-id(issue#I15FKR@Gitee) +* 【extra】 邮件发送后获取message-id(issue#I15FKR@Gitee) +* 【core 】 CaseInsensitiveMap/CamelCaseMap增加toString(issue#636@Github) +* 【core 】 XmlUtil多节点改进(issue#I15I0R@Gitee) ### Bug修复 * 【extra】 修复SFTP.upload上传失败的问题 * 【db】 修复findLike匹配错误问题 +* 【core 】 修复scale方法透明无效问题(issue#I15L5S@Gitee) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/Convert.java b/hutool-core/src/main/java/cn/hutool/core/convert/Convert.java index f5a9ef759..c13a2b4d2 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/Convert.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/Convert.java @@ -4,6 +4,8 @@ import java.lang.reflect.Type; import java.math.BigDecimal; import java.math.BigInteger; import java.nio.charset.Charset; +import java.time.Instant; +import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.TimeUnit; @@ -444,7 +446,35 @@ public class Convert { public static Date toDate(Object value, Date defaultValue) { return convertQuietly(Date.class, value, defaultValue); } - + + /** + * LocalDateTime
    + * 如果给定的值为空,或者转换失败,返回默认值
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + * @since 5.0.7 + */ + public static Date toLocalDateTime(Object value, Date defaultValue) { + return convertQuietly(LocalDateTime.class, value, defaultValue); + } + + /** + * Instant
    + * 如果给定的值为空,或者转换失败,返回默认值
    + * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + * @since 5.0.7 + */ + public static Date toInstant(Object value, Date defaultValue) { + return convertQuietly(Instant.class, value, defaultValue); + } + /** * 转换为Date
    * 如果给定的值为空,或者转换失败,返回null
    diff --git a/hutool-core/src/main/java/cn/hutool/core/getter/OptNullBasicTypeFromObjectGetter.java b/hutool-core/src/main/java/cn/hutool/core/getter/OptNullBasicTypeFromObjectGetter.java index a693ca8c8..3317ffb51 100644 --- a/hutool-core/src/main/java/cn/hutool/core/getter/OptNullBasicTypeFromObjectGetter.java +++ b/hutool-core/src/main/java/cn/hutool/core/getter/OptNullBasicTypeFromObjectGetter.java @@ -10,21 +10,20 @@ import cn.hutool.core.convert.Convert; * 基本类型的getter接口抽象实现,所有类型的值获取都是通过将getObj获得的值转换而来
    * 用户只需实现getObj方法即可,其他类型将会从Object结果中转换 * 在不提供默认值的情况下, 如果值不存在或获取错误,返回null
    + * * @author Looly */ -public abstract class OptNullBasicTypeFromObjectGetter extends OptNullBasicTypeGetter{ +public interface OptNullBasicTypeFromObjectGetter extends OptNullBasicTypeGetter{ - @Override - public String getStr(K key, String defaultValue) { + default String getStr(K key, String defaultValue) { final Object obj = getObj(key); if(null == obj) { return defaultValue; } return Convert.toStr(obj, defaultValue); } - - @Override - public Integer getInt(K key, Integer defaultValue) { + + default Integer getInt(K key, Integer defaultValue) { final Object obj = getObj(key); if(null == obj) { return defaultValue; @@ -32,8 +31,7 @@ public abstract class OptNullBasicTypeFromObjectGetter extends OptNullBasicTy return Convert.toInt(obj, defaultValue); } - @Override - public Short getShort(K key, Short defaultValue) { + default Short getShort(K key, Short defaultValue) { final Object obj = getObj(key); if(null == obj) { return defaultValue; @@ -41,8 +39,7 @@ public abstract class OptNullBasicTypeFromObjectGetter extends OptNullBasicTy return Convert.toShort(obj, defaultValue); } - @Override - public Boolean getBool(K key, Boolean defaultValue) { + default Boolean getBool(K key, Boolean defaultValue) { final Object obj = getObj(key); if(null == obj) { return defaultValue; @@ -50,8 +47,7 @@ public abstract class OptNullBasicTypeFromObjectGetter extends OptNullBasicTy return Convert.toBool(obj, defaultValue); } - @Override - public Long getLong(K key, Long defaultValue) { + default Long getLong(K key, Long defaultValue) { final Object obj = getObj(key); if(null == obj) { return defaultValue; @@ -59,17 +55,15 @@ public abstract class OptNullBasicTypeFromObjectGetter extends OptNullBasicTy return Convert.toLong(obj, defaultValue); } - @Override - public Character getChar(K key, Character defaultValue) { + default Character getChar(K key, Character defaultValue) { final Object obj = getObj(key); if(null == obj) { return defaultValue; } return Convert.toChar(obj, defaultValue); } - - @Override - public Float getFloat(K key, Float defaultValue) { + + default Float getFloat(K key, Float defaultValue) { final Object obj = getObj(key); if(null == obj) { return defaultValue; @@ -77,8 +71,7 @@ public abstract class OptNullBasicTypeFromObjectGetter extends OptNullBasicTy return Convert.toFloat(obj, defaultValue); } - @Override - public Double getDouble(K key, Double defaultValue) { + default Double getDouble(K key, Double defaultValue) { final Object obj = getObj(key); if(null == obj) { return defaultValue; @@ -86,8 +79,7 @@ public abstract class OptNullBasicTypeFromObjectGetter extends OptNullBasicTy return Convert.toDouble(obj, defaultValue); } - @Override - public Byte getByte(K key, Byte defaultValue) { + default Byte getByte(K key, Byte defaultValue) { final Object obj = getObj(key); if(null == obj) { return defaultValue; @@ -95,8 +87,7 @@ public abstract class OptNullBasicTypeFromObjectGetter extends OptNullBasicTy return Convert.toByte(obj, defaultValue); } - @Override - public BigDecimal getBigDecimal(K key, BigDecimal defaultValue) { + default BigDecimal getBigDecimal(K key, BigDecimal defaultValue) { final Object obj = getObj(key); if(null == obj) { return defaultValue; @@ -104,26 +95,23 @@ public abstract class OptNullBasicTypeFromObjectGetter extends OptNullBasicTy return Convert.toBigDecimal(obj, defaultValue); } - @Override - public BigInteger getBigInteger(K key, BigInteger defaultValue) { + default BigInteger getBigInteger(K key, BigInteger defaultValue) { final Object obj = getObj(key); if(null == obj) { return defaultValue; } return Convert.toBigInteger(obj, defaultValue); } - - @Override - public > E getEnum(Class clazz, K key, E defaultValue) { + + default > E getEnum(Class clazz, K key, E defaultValue) { final Object obj = getObj(key); if(null == obj) { return defaultValue; } return Convert.toEnum(clazz, obj, defaultValue); } - - @Override - public Date getDate(K key, Date defaultValue) { + + default Date getDate(K key, Date defaultValue) { final Object obj = getObj(key); if(null == obj) { return defaultValue; diff --git a/hutool-core/src/main/java/cn/hutool/core/getter/OptNullBasicTypeFromStringGetter.java b/hutool-core/src/main/java/cn/hutool/core/getter/OptNullBasicTypeFromStringGetter.java index 13e6eecd4..c0562ec24 100644 --- a/hutool-core/src/main/java/cn/hutool/core/getter/OptNullBasicTypeFromStringGetter.java +++ b/hutool-core/src/main/java/cn/hutool/core/getter/OptNullBasicTypeFromStringGetter.java @@ -12,70 +12,57 @@ import cn.hutool.core.convert.Convert; * * @author Looly */ -public abstract class OptNullBasicTypeFromStringGetter extends OptNullBasicTypeGetter { +public interface OptNullBasicTypeFromStringGetter extends OptNullBasicTypeGetter { - @Override - public Object getObj(K key, Object defaultValue) { + default Object getObj(K key, Object defaultValue) { return getStr(key, null == defaultValue ? null : defaultValue.toString()); } - @Override - public Integer getInt(K key, Integer defaultValue) { + default Integer getInt(K key, Integer defaultValue) { return Convert.toInt(getStr(key), defaultValue); } - @Override - public Short getShort(K key, Short defaultValue) { + default Short getShort(K key, Short defaultValue) { return Convert.toShort(getStr(key), defaultValue); } - @Override - public Boolean getBool(K key, Boolean defaultValue) { + default Boolean getBool(K key, Boolean defaultValue) { return Convert.toBool(getStr(key), defaultValue); } - @Override - public Long getLong(K key, Long defaultValue) { + default Long getLong(K key, Long defaultValue) { return Convert.toLong(getStr(key), defaultValue); } - @Override - public Character getChar(K key, Character defaultValue) { + default Character getChar(K key, Character defaultValue) { return Convert.toChar(getStr(key), defaultValue); } - @Override - public Float getFloat(K key, Float defaultValue) { + default Float getFloat(K key, Float defaultValue) { return Convert.toFloat(getStr(key), defaultValue); } - @Override - public Double getDouble(K key, Double defaultValue) { + default Double getDouble(K key, Double defaultValue) { return Convert.toDouble(getStr(key), defaultValue); } - @Override - public Byte getByte(K key, Byte defaultValue) { + default Byte getByte(K key, Byte defaultValue) { return Convert.toByte(getStr(key), defaultValue); } - @Override - public BigDecimal getBigDecimal(K key, BigDecimal defaultValue) { + default BigDecimal getBigDecimal(K key, BigDecimal defaultValue) { return Convert.toBigDecimal(getStr(key), defaultValue); } - @Override - public BigInteger getBigInteger(K key, BigInteger defaultValue) { + default BigInteger getBigInteger(K key, BigInteger defaultValue) { return Convert.toBigInteger(getStr(key), defaultValue); } - @Override - public > E getEnum(Class clazz, K key, E defaultValue) { + default > E getEnum(Class clazz, K key, E defaultValue) { return Convert.toEnum(clazz, getStr(key), defaultValue); } - @Override - public Date getDate(K key, Date defaultValue) { + default Date getDate(K key, Date defaultValue) { return Convert.toDate(getStr(key), defaultValue); } } diff --git a/hutool-core/src/main/java/cn/hutool/core/getter/OptNullBasicTypeGetter.java b/hutool-core/src/main/java/cn/hutool/core/getter/OptNullBasicTypeGetter.java index 45b40f6a6..df992aa34 100644 --- a/hutool-core/src/main/java/cn/hutool/core/getter/OptNullBasicTypeGetter.java +++ b/hutool-core/src/main/java/cn/hutool/core/getter/OptNullBasicTypeGetter.java @@ -8,13 +8,12 @@ import java.util.Date; * 基本类型的getter接口抽象实现
    * 提供一个统一的接口定义返回不同类型的值(基本类型)
    * 在不提供默认值的情况下, 如果值不存在或获取错误,返回null
    - * 用户只需实现{@code com.xiaoleilu.hutool.getter.OptBasicTypeGetter}接口即可 + * 用户只需实现{@link OptBasicTypeGetter}接口即可 * @author Looly */ -public abstract class OptNullBasicTypeGetter implements BasicTypeGetter, OptBasicTypeGetter{ +public interface OptNullBasicTypeGetter extends BasicTypeGetter, OptBasicTypeGetter{ - @Override - public Object getObj(K key) { + default Object getObj(K key) { return getObj(key, null); } @@ -25,8 +24,7 @@ public abstract class OptNullBasicTypeGetter implements BasicTypeGetter, O * @param key 属性名 * @return 属性值 */ - @Override - public String getStr(K key){ + default String getStr(K key){ return this.getStr(key, null); } @@ -37,8 +35,7 @@ public abstract class OptNullBasicTypeGetter implements BasicTypeGetter, O * @param key 属性名 * @return 属性值 */ - @Override - public Integer getInt(K key) { + default Integer getInt(K key) { return this.getInt(key, null); } @@ -49,8 +46,7 @@ public abstract class OptNullBasicTypeGetter implements BasicTypeGetter, O * @param key 属性名 * @return 属性值 */ - @Override - public Short getShort(K key){ + default Short getShort(K key){ return this.getShort(key, null); } @@ -61,8 +57,7 @@ public abstract class OptNullBasicTypeGetter implements BasicTypeGetter, O * @param key 属性名 * @return 属性值 */ - @Override - public Boolean getBool(K key){ + default Boolean getBool(K key){ return this.getBool(key, null); } @@ -73,8 +68,7 @@ public abstract class OptNullBasicTypeGetter implements BasicTypeGetter, O * @param key 属性名 * @return 属性值 */ - @Override - public Long getLong(K key){ + default Long getLong(K key){ return this.getLong(key, null); } @@ -85,8 +79,7 @@ public abstract class OptNullBasicTypeGetter implements BasicTypeGetter, O * @param key 属性名 * @return 属性值 */ - @Override - public Character getChar(K key){ + default Character getChar(K key){ return this.getChar(key, null); } @@ -97,8 +90,7 @@ public abstract class OptNullBasicTypeGetter implements BasicTypeGetter, O * @param key 属性名 * @return 属性值 */ - @Override - public Float getFloat(K key){ + default Float getFloat(K key){ return this.getFloat(key, null); } @@ -109,11 +101,10 @@ public abstract class OptNullBasicTypeGetter implements BasicTypeGetter, O * @param key 属性名 * @return 属性值 */ - @Override - public Double getDouble(K key){ + default Double getDouble(K key){ return this.getDouble(key, null); } - + /** * 获取byte型属性值
    * 无值或获取错误返回null @@ -121,8 +112,7 @@ public abstract class OptNullBasicTypeGetter implements BasicTypeGetter, O * @param key 属性名 * @return 属性值 */ - @Override - public Byte getByte(K key){ + default Byte getByte(K key){ return this.getByte(key, null); } @@ -133,8 +123,7 @@ public abstract class OptNullBasicTypeGetter implements BasicTypeGetter, O * @param key 属性名 * @return 属性值 */ - @Override - public BigDecimal getBigDecimal(K key){ + default BigDecimal getBigDecimal(K key){ return this.getBigDecimal(key, null); } @@ -145,8 +134,7 @@ public abstract class OptNullBasicTypeGetter implements BasicTypeGetter, O * @param key 属性名 * @return 属性值 */ - @Override - public BigInteger getBigInteger(K key){ + default BigInteger getBigInteger(K key){ return this.getBigInteger(key, null); } @@ -158,8 +146,7 @@ public abstract class OptNullBasicTypeGetter implements BasicTypeGetter, O * @param key 属性名 * @return 属性值 */ - @Override - public > E getEnum(Class clazz, K key) { + default > E getEnum(Class clazz, K key) { return this.getEnum(clazz, key, null); } @@ -170,8 +157,7 @@ public abstract class OptNullBasicTypeGetter implements BasicTypeGetter, O * @param key 属性名 * @return 属性值 */ - @Override - public Date getDate(K key) { + default Date getDate(K key) { return this.getDate(key, null); } } diff --git a/hutool-core/src/main/java/cn/hutool/core/img/Img.java b/hutool-core/src/main/java/cn/hutool/core/img/Img.java index eefd84636..9058c533f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/img/Img.java +++ b/hutool-core/src/main/java/cn/hutool/core/img/Img.java @@ -53,7 +53,7 @@ public class Img implements Serializable { /** * 目标图片文件格式,用于写出 */ - private String targetImageType = ImgUtil.IMAGE_TYPE_JPG; + private String targetImageType; /** * 计算x,y坐标的时候是否从中心做为原始坐标开始计算 */ @@ -140,7 +140,22 @@ public class Img implements Serializable { * @param srcImage 来源图片 */ public Img(BufferedImage srcImage) { + this(srcImage, null); + } + + /** + * 构造 + * + * @param srcImage 来源图片 + * @param targetImageType 目标图片类型 + * @since 5.0.7 + */ + public Img(BufferedImage srcImage, String targetImageType) { this.srcImage = srcImage; + if(null == targetImageType){ + targetImageType = ImgUtil.IMAGE_TYPE_JPG; + } + this.targetImageType = targetImageType; } /** @@ -294,15 +309,14 @@ public class Img implements Serializable { srcHeight = srcImage.getHeight(null); srcWidth = srcImage.getWidth(null); - if (null == fixedColor) {// 补白 - fixedColor = Color.WHITE; - } final BufferedImage image = new BufferedImage(width, height, getTypeInt()); Graphics2D g = image.createGraphics(); // 设置背景 - g.setBackground(fixedColor); - g.clearRect(0, 0, width, height); + if(null != fixedColor){ + g.setBackground(fixedColor); + g.clearRect(0, 0, width, height); + } // 在中间贴图 g.drawImage(srcImage, (width - srcWidth) / 2, (height - srcHeight) / 2, srcWidth, srcHeight, fixedColor, null); @@ -586,6 +600,7 @@ public class Img implements Serializable { } if (targetFile.exists()) { + //noinspection ResultOfMethodCallIgnored targetFile.delete(); } @@ -624,6 +639,7 @@ public class Img implements Serializable { * @see BufferedImage#TYPE_INT_RGB */ private int getTypeInt() { + //noinspection SwitchStatementWithTooFewBranches switch (this.targetImageType) { case ImgUtil.IMAGE_TYPE_PNG: return BufferedImage.TYPE_INT_ARGB; @@ -678,6 +694,7 @@ public class Img implements Serializable { if (degree >= 90) { if (degree / 90 % 2 == 1) { int temp = height; + //noinspection SuspiciousNameCombination height = width; width = temp; } diff --git a/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java b/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java index 58980cc27..492ab2cc0 100644 --- a/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java @@ -171,17 +171,20 @@ public class ImgUtil { /** * 缩放图像(按高度和宽度缩放)
    - * 缩放后默认为jpeg格式 + * 缩放后默认格式与源图片相同,无法识别原图片默认JPG * * @param srcImageFile 源图像文件地址 * @param destImageFile 缩放后的图像地址 * @param width 缩放后的宽度 * @param height 缩放后的高度 - * @param fixedColor 比例不对时补充的颜色,不补充为null + * @param fixedColor 补充的颜色,不补充为null * @throws IORuntimeException IO异常 */ public static void scale(File srcImageFile, File destImageFile, int width, int height, Color fixedColor) throws IORuntimeException { - write(scale(read(srcImageFile), width, height, fixedColor), destImageFile); + Img.from(srcImageFile)// + .setTargetImageType(FileUtil.extName(destImageFile))// + .scale(width, height, fixedColor)// + .write(destImageFile); } /** @@ -397,12 +400,12 @@ public class ImgUtil { if (srcWidth % destWidth == 0) { cols = srcWidth / destWidth; } else { - cols = (int) Math.floor(srcWidth / destWidth) + 1; + cols = (int) Math.floor((double)srcWidth / destWidth) + 1; } if (srcHeight % destHeight == 0) { rows = srcHeight / destHeight; } else { - rows = (int) Math.floor(srcHeight / destHeight) + 1; + rows = (int) Math.floor((double)srcHeight / destHeight) + 1; } // 循环建立切片 Image tag; diff --git a/hutool-core/src/main/java/cn/hutool/core/map/CamelCaseLinkedMap.java b/hutool-core/src/main/java/cn/hutool/core/map/CamelCaseLinkedMap.java index 47f0e00b3..a9b77f6c3 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/CamelCaseLinkedMap.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/CamelCaseLinkedMap.java @@ -60,7 +60,7 @@ public class CamelCaseLinkedMap extends CamelCaseMap { * @param loadFactor 加载因子 */ public CamelCaseLinkedMap(int initialCapacity, float loadFactor) { - super(new HashMap(initialCapacity, loadFactor)); + super(new HashMap<>(initialCapacity, loadFactor)); } // ------------------------------------------------------------------------- Constructor end } diff --git a/hutool-core/src/main/java/cn/hutool/core/map/CamelCaseMap.java b/hutool-core/src/main/java/cn/hutool/core/map/CamelCaseMap.java index 8dc8d4faf..0da049ec0 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/CamelCaseMap.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/CamelCaseMap.java @@ -62,7 +62,7 @@ public class CamelCaseMap extends CustomKeyMap { * @param loadFactor 加载因子 */ public CamelCaseMap(int initialCapacity, float loadFactor) { - super(new HashMap(initialCapacity, loadFactor)); + super(new HashMap<>(initialCapacity, loadFactor)); } // ------------------------------------------------------------------------- Constructor end @@ -74,7 +74,7 @@ public class CamelCaseMap extends CustomKeyMap { */ @Override protected Object customKey(Object key) { - if (null != key && key instanceof CharSequence) { + if (key instanceof CharSequence) { key = StrUtil.toCamelCase(key.toString()); } return key; diff --git a/hutool-core/src/main/java/cn/hutool/core/map/CaseInsensitiveLinkedMap.java b/hutool-core/src/main/java/cn/hutool/core/map/CaseInsensitiveLinkedMap.java index 8bc486ee2..5fe5d503a 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/CaseInsensitiveLinkedMap.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/CaseInsensitiveLinkedMap.java @@ -61,7 +61,7 @@ public class CaseInsensitiveLinkedMap extends CaseInsensitiveMap { * @param loadFactor 加载因子 */ public CaseInsensitiveLinkedMap(int initialCapacity, float loadFactor) { - super(new LinkedHashMap(initialCapacity, loadFactor)); + super(new LinkedHashMap<>(initialCapacity, loadFactor)); } // ------------------------------------------------------------------------- Constructor end } diff --git a/hutool-core/src/main/java/cn/hutool/core/map/MapProxy.java b/hutool-core/src/main/java/cn/hutool/core/map/MapProxy.java index 7865e2ad1..2d9875605 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/MapProxy.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/MapProxy.java @@ -21,7 +21,7 @@ import cn.hutool.core.util.StrUtil; * @author looly * @since 3.2.0 */ -public class MapProxy extends OptNullBasicTypeFromObjectGetter implements Map, InvocationHandler, Serializable { +public class MapProxy implements Map, OptNullBasicTypeFromObjectGetter, InvocationHandler, Serializable { private static final long serialVersionUID = 1L; @SuppressWarnings("rawtypes") @@ -89,7 +89,7 @@ public class MapProxy extends OptNullBasicTypeFromObjectGetter implement return map.remove(key); } - @SuppressWarnings("unchecked") + @SuppressWarnings({"unchecked", "NullableProblems"}) @Override public void putAll(Map m) { map.putAll(m); @@ -100,19 +100,19 @@ public class MapProxy extends OptNullBasicTypeFromObjectGetter implement map.clear(); } - @SuppressWarnings("unchecked") + @SuppressWarnings({"unchecked", "NullableProblems"}) @Override public Set keySet() { return map.keySet(); } - @SuppressWarnings("unchecked") + @SuppressWarnings({"unchecked", "NullableProblems"}) @Override public Collection values() { return map.values(); } - @SuppressWarnings("unchecked") + @SuppressWarnings({"unchecked", "NullableProblems"}) @Override public Set> entrySet() { return map.entrySet(); diff --git a/hutool-core/src/main/java/cn/hutool/core/map/MapWrapper.java b/hutool-core/src/main/java/cn/hutool/core/map/MapWrapper.java index 436a0dbde..79cdd94f4 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/MapWrapper.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/MapWrapper.java @@ -79,6 +79,7 @@ public class MapWrapper implements Map, Iterable>, S } @Override + @SuppressWarnings("NullableProblems") public void putAll(Map m) { raw.putAll(m); } @@ -89,23 +90,31 @@ public class MapWrapper implements Map, Iterable>, S } @Override - public Set keySet() { - return raw.keySet(); - } - - @Override + @SuppressWarnings("NullableProblems") public Collection values() { return raw.values(); } @Override + @SuppressWarnings("NullableProblems") + public Set keySet() { + return raw.keySet(); + } + + @Override + @SuppressWarnings("NullableProblems") public Set> entrySet() { return raw.entrySet(); } @Override + @SuppressWarnings("NullableProblems") public Iterator> iterator() { return this.entrySet().iterator(); } + @Override + public String toString() { + return raw.toString(); + } } 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 efbfb0fc1..33c50d549 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/XmlUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/XmlUtil.java @@ -33,6 +33,7 @@ import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; +import cn.hutool.core.collection.CollUtil; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -756,7 +757,12 @@ public class XmlUtil { childNode = nodeList.item(i); if (isElement(childNode)) { childEle = (Element) childNode; - result.put(childEle.getNodeName(), childEle.getTextContent()); + final Object value = result.get(childEle.getNodeName()); + if(null != value){ + result.put(childEle.getNodeName(), CollUtil.newArrayList(value, childEle.getTextContent())); + } else{ + result.put(childEle.getNodeName(), childEle.getTextContent()); + } } } return result; 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 463e40826..c29d8583c 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,17 +1,16 @@ package cn.hutool.core.util; -import java.util.LinkedHashMap; -import java.util.Map; - -import javax.xml.xpath.XPathConstants; - +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapBuilder; +import cn.hutool.core.map.MapUtil; import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; import org.w3c.dom.Document; -import cn.hutool.core.map.MapBuilder; -import cn.hutool.core.map.MapUtil; +import javax.xml.xpath.XPathConstants; +import java.util.LinkedHashMap; +import java.util.Map; /** * {@link XmlUtil} 工具类 @@ -86,6 +85,15 @@ public class XmlUtilTest { Assert.assertEquals("1", map.get("successCounts")); } + @Test + public void xmlToMapTest2() { + String xml = "张三李四"; + Map map = XmlUtil.xmlToMap(xml); + + Assert.assertEquals(1, map.size()); + Assert.assertEquals(CollUtil.newArrayList("张三", "李四"), map.get("name")); + } + @Test public void mapToXmlTest() { Map map = MapBuilder.create(new LinkedHashMap())// 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 49610bc68..bd8bd5d85 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONArray.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONArray.java @@ -19,6 +19,8 @@ import java.util.List; import java.util.ListIterator; import java.util.RandomAccess; +import static cn.hutool.json.JSONConverter.*; + /** * JSON数组
    * JSON数组是表示中括号括住的数据表现形式
    @@ -30,7 +32,7 @@ import java.util.RandomAccess; * * @author looly */ -public class JSONArray extends JSONGetter implements JSON, List, RandomAccess { +public class JSONArray implements JSON, JSONGetter, List, RandomAccess { private static final long serialVersionUID = 2664900568717612292L; /** 默认初始大小 */ @@ -236,7 +238,7 @@ public class JSONArray extends JSONGetter implements JSON, List @Override public T getByPath(String expression, Class resultType) { - return JSONConverter.jsonConvert(resultType, getByPath(expression), true); + return jsonConvert(resultType, getByPath(expression), true); } @Override @@ -314,6 +316,7 @@ public class JSONArray extends JSONGetter implements JSON, List } } + @SuppressWarnings("NullableProblems") @Override public Iterator iterator() { return rawList.iterator(); @@ -344,13 +347,14 @@ public class JSONArray extends JSONGetter implements JSON, List return rawList.contains(o); } + @SuppressWarnings("NullableProblems") @Override public Object[] toArray() { return rawList.toArray(); } @Override - @SuppressWarnings("unchecked") + @SuppressWarnings({"unchecked", "NullableProblems"}) public T[] toArray(T[] a) { return (T[]) JSONConverter.toArray(this, a.getClass().getComponentType()); } @@ -370,11 +374,13 @@ public class JSONArray extends JSONGetter implements JSON, List return rawList.remove(o); } + @SuppressWarnings("NullableProblems") @Override public boolean containsAll(Collection c) { return rawList.containsAll(c); } + @SuppressWarnings("NullableProblems") @Override public boolean addAll(Collection c) { if (CollUtil.isEmpty(c)) { @@ -386,6 +392,7 @@ public class JSONArray extends JSONGetter implements JSON, List return true; } + @SuppressWarnings("NullableProblems") @Override public boolean addAll(int index, Collection c) { if (CollUtil.isEmpty(c)) { @@ -398,11 +405,13 @@ public class JSONArray extends JSONGetter implements JSON, List return rawList.addAll(index, list); } + @SuppressWarnings("NullableProblems") @Override public boolean removeAll(Collection c) { return this.rawList.removeAll(c); } + @SuppressWarnings("NullableProblems") @Override public boolean retainAll(Collection c) { return this.rawList.retainAll(c); @@ -446,16 +455,19 @@ public class JSONArray extends JSONGetter implements JSON, List return this.rawList.lastIndexOf(o); } + @SuppressWarnings("NullableProblems") @Override public ListIterator listIterator() { return this.rawList.listIterator(); } + @SuppressWarnings("NullableProblems") @Override public ListIterator listIterator(int index) { return this.rawList.listIterator(index); } + @SuppressWarnings("NullableProblems") @Override public List subList(int fromIndex, int toIndex) { return this.rawList.subList(fromIndex, toIndex); 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 d7b91723a..547e15c99 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONGetter.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONGetter.java @@ -9,7 +9,7 @@ import cn.hutool.core.getter.OptNullBasicTypeFromObjectGetter; * * @param Key类型 */ -public abstract class JSONGetter extends OptNullBasicTypeFromObjectGetter{ +public interface JSONGetter extends OptNullBasicTypeFromObjectGetter{ /** * key对应值是否为null或无此key @@ -17,7 +17,7 @@ public abstract class JSONGetter extends OptNullBasicTypeFromObjectGetter{ * @param key 键 * @return true 无此key或值为null或{@link JSONNull#NULL}返回false,其它返回true */ - public boolean isNull(K key) { + default boolean isNull(K key) { return JSONNull.NULL.equals(this.getObj(key)); } @@ -28,7 +28,7 @@ public abstract class JSONGetter extends OptNullBasicTypeFromObjectGetter{ * @return 字符串类型值 * @since 4.2.2 */ - public String getStrEscaped(K key) { + default String getStrEscaped(K key) { return getStrEscaped(key, null); } @@ -40,7 +40,7 @@ public abstract class JSONGetter extends OptNullBasicTypeFromObjectGetter{ * @return 字符串类型值 * @since 4.2.2 */ - public String getStrEscaped(K key, String defaultValue) { + default String getStrEscaped(K key, String defaultValue) { return JSONUtil.escape(getStr(key, defaultValue)); } @@ -51,7 +51,7 @@ public abstract class JSONGetter extends OptNullBasicTypeFromObjectGetter{ * @param key KEY * @return JSONArray对象,如果值为null或者非JSONArray类型,返回null */ - public JSONArray getJSONArray(K key) { + default JSONArray getJSONArray(K key) { final Object object = this.getObj(key); if(null == object) { return null; @@ -70,7 +70,7 @@ public abstract class JSONGetter extends OptNullBasicTypeFromObjectGetter{ * @param key KEY * @return JSONArray对象,如果值为null或者非JSONObject类型,返回null */ - public JSONObject getJSONObject(K key) { + default JSONObject getJSONObject(K key) { final Object object = this.getObj(key); if(null == object) { return null; @@ -92,7 +92,7 @@ public abstract class JSONGetter extends OptNullBasicTypeFromObjectGetter{ * @return Bean对象,如果值为null或者非JSONObject类型,返回null * @since 3.1.1 */ - public T getBean(K key, Class beanType) { + default T getBean(K key, Class beanType) { final JSONObject obj = getJSONObject(key); return (null == obj) ? null : obj.toBean(beanType); } @@ -108,7 +108,7 @@ public abstract class JSONGetter extends OptNullBasicTypeFromObjectGetter{ * @throws ConvertException 转换异常 * @since 3.0.8 */ - public T get(K key, Class type) throws ConvertException{ + default T get(K key, Class type) throws ConvertException{ return get(key, type, false); } @@ -123,7 +123,7 @@ public abstract class JSONGetter extends OptNullBasicTypeFromObjectGetter{ * @throws ConvertException 转换异常 * @since 3.0.8 */ - public T get(K key, Class type, boolean ignoreError) throws ConvertException{ + default T get(K key, Class type, boolean ignoreError) throws ConvertException{ final Object value = this.getObj(key); if(null == value){ return null; 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 1ff889878..4ec0ce078 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONObject.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONObject.java @@ -37,7 +37,7 @@ import java.util.Set; * * @author looly */ -public class JSONObject extends JSONGetter implements JSON, Map { +public class JSONObject implements JSON, JSONGetter, Map { private static final long serialVersionUID = -330220388580734346L; /** 默认初始大小 */ @@ -163,7 +163,7 @@ public class JSONObject extends JSONGetter implements JSON, Map implements JSON, Map keySet() { return this.rawHashMap.keySet(); } + @SuppressWarnings("NullableProblems") @Override public Collection values() { return rawHashMap.values(); } + @SuppressWarnings("NullableProblems") @Override public Set> entrySet() { return rawHashMap.entrySet(); @@ -643,7 +646,7 @@ public class JSONObject extends JSONGetter implements JSON, Map implements Serializable { +public abstract class AbsSetting implements OptNullBasicTypeFromStringGetter, Serializable { private static final long serialVersionUID = 6200156302595905863L; private final static Log log = LogFactory.get(); From 0b6c01bac2456d8605c5b5d71ffcc22835a314cb Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 26 Nov 2019 11:44:42 +0800 Subject: [PATCH 07/17] add setCellValue method --- .../cn/hutool/poi/excel/cell/CellUtil.java | 51 ++++++++++++++----- 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/cell/CellUtil.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/cell/CellUtil.java index e44d66abe..07092d5db 100644 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/cell/CellUtil.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/cell/CellUtil.java @@ -153,20 +153,53 @@ public class CellUtil { } } + if (value instanceof Date) { + if (null != styleSet && null != styleSet.getCellStyleForDate()) { + cell.setCellStyle(styleSet.getCellStyleForDate()); + } + } else if (value instanceof TemporalAccessor) { + if (null != styleSet && null != styleSet.getCellStyleForDate()) { + cell.setCellStyle(styleSet.getCellStyleForDate()); + } + } else if (value instanceof Calendar) { + if (null != styleSet && null != styleSet.getCellStyleForDate()) { + cell.setCellStyle(styleSet.getCellStyleForDate()); + } + } else if (value instanceof Number) { + if ((value instanceof Double || value instanceof Float || value instanceof BigDecimal) && null != styleSet && null != styleSet.getCellStyleForNumber()) { + cell.setCellStyle(styleSet.getCellStyleForNumber()); + } + } + + setCellValue(cell, value, null); + } + + /** + * 设置单元格值
    + * 根据传入的styleSet自动匹配样式
    + * 当为头部样式时默认赋值头部样式,但是头部中如果有数字、日期等类型,将按照数字、日期样式设置 + * + * @param cell 单元格 + * @param value 值 + * @param style 自定义样式,null表示无样式 + */ + public static void setCellValue(Cell cell, Object value, CellStyle style) { + if (null == cell) { + return; + } + + if (null != style) { + cell.setCellStyle(style); + } + if (null == value) { cell.setCellValue(StrUtil.EMPTY); } else if (value instanceof FormulaCellValue) { // 公式 cell.setCellFormula(((FormulaCellValue) value).getValue()); } else if (value instanceof Date) { - if (null != styleSet && null != styleSet.getCellStyleForDate()) { - cell.setCellStyle(styleSet.getCellStyleForDate()); - } cell.setCellValue((Date) value); } else if (value instanceof TemporalAccessor) { - if (null != styleSet && null != styleSet.getCellStyleForDate()) { - cell.setCellStyle(styleSet.getCellStyleForDate()); - } if (value instanceof Instant) { cell.setCellValue(Date.from((Instant) value)); } else if (value instanceof LocalDateTime) { @@ -175,18 +208,12 @@ public class CellUtil { cell.setCellValue((LocalDate) value); } } else if (value instanceof Calendar) { - if (null != styleSet && null != styleSet.getCellStyleForDate()) { - cell.setCellStyle(styleSet.getCellStyleForDate()); - } cell.setCellValue((Calendar) value); } else if (value instanceof Boolean) { cell.setCellValue((Boolean) value); } else if (value instanceof RichTextString) { cell.setCellValue((RichTextString) value); } else if (value instanceof Number) { - if ((value instanceof Double || value instanceof Float || value instanceof BigDecimal) && null != styleSet && null != styleSet.getCellStyleForNumber()) { - cell.setCellStyle(styleSet.getCellStyleForNumber()); - } cell.setCellValue(((Number) value).doubleValue()); } else { cell.setCellValue(value.toString()); From b6ded332d51ca1d2c68a19b50b6d174ec0294513 Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 26 Nov 2019 11:48:18 +0800 Subject: [PATCH 08/17] fix bugs --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b4a3a1a9c..86a1d35ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,7 @@ * 【core 】 XmlUtil多节点改进(issue#I15I0R@Gitee) ### Bug修复 -* 【extra】 修复SFTP.upload上传失败的问题 +* 【extra】 修复SFTP.upload上传失败的问题(issue#I15O40@Gitee) * 【db】 修复findLike匹配错误问题 * 【core 】 修复scale方法透明无效问题(issue#I15L5S@Gitee) From 9a4ec7bce2a82c74faadec6d609ee2a493d22864 Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 26 Nov 2019 11:52:47 +0800 Subject: [PATCH 09/17] remove hasNull --- .../java/cn/hutool/core/bean/BeanUtil.java | 26 ------------------- 1 file changed, 26 deletions(-) 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 05b7a39c3..72134cc1d 100644 --- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java @@ -117,32 +117,6 @@ public class BeanUtil { return PropertyEditorManager.findEditor(type); } - /** - * 判断Bean中是否有值为null的字段 - * - * @param bean Bean - * @return 是否有值为null的字段 - * @deprecated 请使用{@link #hasNullField(Object)} - */ - @Deprecated - public static boolean hasNull(Object bean) { - final Field[] fields = ClassUtil.getDeclaredFields(bean.getClass()); - - Object fieldValue = null; - for (Field field : fields) { - field.setAccessible(true); - try { - fieldValue = field.get(bean); - } catch (Exception e) { - //ignore - } - if (null == fieldValue) { - return true; - } - } - return false; - } - /** * 获取{@link BeanDesc} Bean描述信息 * From 8958a11b770bbed4ca7c2e97c2072aa3929e9f34 Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 26 Nov 2019 11:58:17 +0800 Subject: [PATCH 10/17] ignore test --- hutool-extra/src/test/java/cn/hutool/extra/mail/MailTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 bb7c166ec..998bed40f 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 @@ -40,7 +40,7 @@ public class MailTest { } @Test -// @Ignore + @Ignore public void sendHtmlTest() { MailUtil.send("hutool@foxmail.com", "测试", "

    邮件来自Hutool测试

    ", true); } From da031ee61cb1435c9c28ffef05d081e338ee331c Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 26 Nov 2019 12:06:06 +0800 Subject: [PATCH 11/17] remove test and fix comment --- .../http/webservice/SoapClientTest.java | 23 ------------------- .../java/cn/hutool/setting/AbsSetting.java | 2 ++ 2 files changed, 2 insertions(+), 23 deletions(-) diff --git a/hutool-http/src/test/java/cn/hutool/http/webservice/SoapClientTest.java b/hutool-http/src/test/java/cn/hutool/http/webservice/SoapClientTest.java index 84c39ec36..57441ebb0 100644 --- a/hutool-http/src/test/java/cn/hutool/http/webservice/SoapClientTest.java +++ b/hutool-http/src/test/java/cn/hutool/http/webservice/SoapClientTest.java @@ -42,27 +42,4 @@ public class SoapClientTest { SOAPMessage message = client.sendForMessage(); Console.log(message.getSOAPBody().getTextContent()); } - - - @Test - public void test(){ - final SoapClient soapClient = SoapClient.create("http://117.132.161.47:6403/services/JybgService") - .setMethod("ser:zzjRequest", "http://service.jfsoft.com/") - .setParam("arg0", "\n" + - "3\n" + - "C00002347\n" + - "20191101\n" + - "20191115\n" + - "JKGCOnline000001\n" + - "GetLisReport\n" + - "自助机01\n" + - "zzj01\n" + - "20191116153748\n" + - "\n" + - "]]>", false); - - final String send = soapClient.send(); - Console.log(HtmlUtil.unescape(send)); - } } diff --git a/hutool-setting/src/main/java/cn/hutool/setting/AbsSetting.java b/hutool-setting/src/main/java/cn/hutool/setting/AbsSetting.java index 370b9917f..d4b88433f 100644 --- a/hutool-setting/src/main/java/cn/hutool/setting/AbsSetting.java +++ b/hutool-setting/src/main/java/cn/hutool/setting/AbsSetting.java @@ -268,6 +268,7 @@ public abstract class AbsSetting implements OptNullBasicTypeFromStringGetter * 只支持基本类型的转换 * + * @param Bean类型 * @param group 分组 * @param bean Bean对象 * @return Bean @@ -291,6 +292,7 @@ public abstract class AbsSetting implements OptNullBasicTypeFromStringGetter * 只支持基本类型的转换 * + * @param Bean类型 * @param group 分组 * @param beanClass Bean类型 * @return Bean From 6c62973048d66b7aabc8fa3b662897c95e5da38b Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 29 Nov 2019 10:58:25 +0800 Subject: [PATCH 12/17] fix ssh bug --- CHANGELOG.md | 2 ++ .../src/main/java/cn/hutool/core/thread/ThreadUtil.java | 3 ++- hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java | 4 ++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 86a1d35ad..fbeadc8ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,11 +11,13 @@ * 【extra】 邮件发送后获取message-id(issue#I15FKR@Gitee) * 【core 】 CaseInsensitiveMap/CamelCaseMap增加toString(issue#636@Github) * 【core 】 XmlUtil多节点改进(issue#I15I0R@Gitee) +* 【core 】 Thread.excAsync修正为execAsync(issue#642@Github) ### Bug修复 * 【extra】 修复SFTP.upload上传失败的问题(issue#I15O40@Gitee) * 【db】 修复findLike匹配错误问题 * 【core 】 修复scale方法透明无效问题(issue#I15L5S@Gitee) +* 【extra】 修复exec返回无效(issue#I15L5S@Gitee) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/ThreadUtil.java b/hutool-core/src/main/java/cn/hutool/core/thread/ThreadUtil.java index 3a987578c..4a35c563b 100644 --- a/hutool-core/src/main/java/cn/hutool/core/thread/ThreadUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/thread/ThreadUtil.java @@ -101,7 +101,7 @@ public class ThreadUtil { * @param isDaemon 是否守护线程。守护线程会在主线程结束后自动结束 * @return 执行的方法体 */ - public static Runnable excAsync(final Runnable runnable, boolean isDaemon) { + public static Runnable execAsync(final Runnable runnable, boolean isDaemon) { Thread thread = new Thread(runnable); thread.setDaemon(isDaemon); thread.start(); @@ -432,6 +432,7 @@ public class ThreadUtil { * @param obj 对象所在线程 * @since 4.5.6 */ + @SuppressWarnings("SynchronizationOnLocalVariableOrMethodParameter") public static void sync(Object obj) { synchronized (obj) { try { diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java index 97b33fad0..55608f890 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java @@ -356,13 +356,13 @@ public class JschUtil { if (null == charset) { charset = CharsetUtil.CHARSET_UTF_8; } - final ChannelExec channel = (ChannelExec) openChannel(session, ChannelType.EXEC); + final ChannelExec channel = (ChannelExec) createChannel(session, ChannelType.EXEC); channel.setCommand(StrUtil.bytes(cmd, charset)); channel.setInputStream(null); channel.setErrStream(errStream); InputStream in = null; try { - channel.start(); + channel.connect(); in = channel.getInputStream(); return IoUtil.read(in, CharsetUtil.CHARSET_UTF_8); } catch (IOException e) { From 14c343fefd01735856549611c0775c6758a08c06 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 2 Dec 2019 17:36:44 +0800 Subject: [PATCH 13/17] add methods --- CHANGELOG.md | 3 + .../main/java/cn/hutool/core/io/FileUtil.java | 67 ++++++++++++++++--- .../main/java/cn/hutool/core/net/NetUtil.java | 26 +++++++ .../java/cn/hutool/core/util/ReflectUtil.java | 35 ++++++---- .../java/cn/hutool/core/util/StrUtil.java | 6 +- .../java/cn/hutool/core/io/FileUtilTest.java | 7 +- 6 files changed, 116 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fbeadc8ae..e43c33b3c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,9 @@ * 【core 】 CaseInsensitiveMap/CamelCaseMap增加toString(issue#636@Github) * 【core 】 XmlUtil多节点改进(issue#I15I0R@Gitee) * 【core 】 Thread.excAsync修正为execAsync(issue#642@Github) +* 【core 】 FileUtil.getAbsolutePath修正正则(issue#648@Github) +* 【core 】 NetUtil增加getNetworkInterface方法(issue#I15WEL@Gitee) +* 【core 】 增加ReflectUtil.getFieldMap方法(issue#I15WJ7@Gitee) ### Bug修复 * 【extra】 修复SFTP.upload上传失败的问题(issue#I15O40@Gitee) 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 d12af648e..8889d8bee 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java @@ -1,23 +1,65 @@ package cn.hutool.core.io; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.file.FileCopier; +import cn.hutool.core.io.file.FileMode; import cn.hutool.core.io.file.FileReader; -import cn.hutool.core.io.file.*; -import cn.hutool.core.io.file.FileWriter; import cn.hutool.core.io.file.FileReader.ReaderHandler; +import cn.hutool.core.io.file.FileWriter; +import cn.hutool.core.io.file.LineSeparator; +import cn.hutool.core.io.file.Tailer; import cn.hutool.core.io.resource.ResourceUtil; import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.*; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.CharUtil; +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.ClassUtil; +import cn.hutool.core.util.ReUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.URLUtil; +import cn.hutool.core.util.ZipUtil; -import java.io.*; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileFilter; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.io.RandomAccessFile; +import java.io.Reader; import java.net.URI; import java.net.URL; import java.net.URLConnection; import java.nio.charset.Charset; -import java.nio.file.*; +import java.nio.file.CopyOption; +import java.nio.file.DirectoryStream; +import java.nio.file.FileVisitOption; +import java.nio.file.FileVisitResult; +import java.nio.file.FileVisitor; +import java.nio.file.Files; +import java.nio.file.LinkOption; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.StandardCopyOption; import java.nio.file.attribute.BasicFileAttributes; import java.text.DecimalFormat; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.EnumSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; import java.util.jar.JarFile; import java.util.regex.Pattern; import java.util.zip.CRC32; @@ -562,8 +604,8 @@ public class FileUtil { if (ArrayUtil.isEmpty(subFiles)) { return 0L;// empty directory } - for (int i = 0; i < subFiles.length; i++) { - size += size(subFiles[i]); + for (File subFile : subFiles) { + size += size(subFile); } return size; } else { @@ -629,6 +671,7 @@ public class FileUtil { if (false == file.exists()) { mkParentDirs(file); try { + //noinspection ResultOfMethodCallIgnored file.createNewFile(); } catch (Exception e) { throw new IORuntimeException(e); @@ -672,6 +715,7 @@ public class FileUtil { public static File mkParentDirs(File file) { final File parentFile = file.getParentFile(); if (null != parentFile && false == parentFile.exists()) { + //noinspection ResultOfMethodCallIgnored parentFile.mkdirs(); } return parentFile; @@ -835,6 +879,7 @@ public class FileUtil { final File[] files = directory.listFiles(); if (ArrayUtil.isEmpty(files)) { // 空文件夹则删除之 + //noinspection ResultOfMethodCallIgnored directory.delete(); } else { for (File childFile : files) { @@ -871,6 +916,7 @@ public class FileUtil { return null; } if (false == dir.exists()) { + //noinspection ResultOfMethodCallIgnored dir.mkdirs(); } return dir; @@ -918,7 +964,9 @@ public class FileUtil { try { File file = File.createTempFile(prefix, suffix, dir).getCanonicalFile(); if (isReCreat) { + //noinspection ResultOfMethodCallIgnored file.delete(); + //noinspection ResultOfMethodCallIgnored file.createNewFile(); } return file; @@ -1083,6 +1131,7 @@ public class FileUtil { } if (isOverride && dest.isFile()) {// 只有目标为文件的情况下覆盖之 + //noinspection ResultOfMethodCallIgnored dest.delete(); } @@ -1238,7 +1287,7 @@ public class FileUtil { } // 给定的路径已经是绝对路径了 - return StrUtil.C_SLASH == path.charAt(0) || path.matches("^[a-zA-Z]:[/\\\\].*"); + return StrUtil.C_SLASH == path.charAt(0) || path.matches("^[a-zA-Z]:([/\\\\].*)?"); } /** diff --git a/hutool-core/src/main/java/cn/hutool/core/net/NetUtil.java b/hutool-core/src/main/java/cn/hutool/core/net/NetUtil.java index 2aea06c61..1d4eb771e 100644 --- a/hutool-core/src/main/java/cn/hutool/core/net/NetUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/net/NetUtil.java @@ -298,6 +298,32 @@ public class NetUtil { } } + /** + * 获取指定名称的网卡信息 + * + * @param name 网络接口名,例如Linux下默认是eth0 + * @return 网卡,未找到返回null + * @since 5.0.7 + */ + public static NetworkInterface getNetworkInterface(String name) { + Enumeration networkInterfaces; + try { + networkInterfaces = NetworkInterface.getNetworkInterfaces(); + } catch (SocketException e) { + return null; + } + + NetworkInterface netInterface; + while(networkInterfaces.hasMoreElements()){ + netInterface = networkInterfaces.nextElement(); + if(null != netInterface && name.equals(netInterface.getName())){ + return netInterface; + } + } + + return null; + } + /** * 获取本机所有网卡 * diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java index a18a0cc2c..75c09d418 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java @@ -6,14 +6,17 @@ import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Filter; import cn.hutool.core.lang.SimpleCache; +import cn.hutool.core.map.MapUtil; import java.lang.reflect.AccessibleObject; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; /** @@ -133,6 +136,22 @@ public class ReflectUtil { return null; } + /** + * 获取指定类中字段名和字段对应的Map,包括其父类中的字段 + * + * @param beanClass 类 + * @return 字段名和字段对应的Map + * @since 5.0.7 + */ + public static Map getFieldMap(Class beanClass){ + final Field[] fields = getFields(beanClass); + final HashMap map = MapUtil.newHashMap(fields.length); + for (Field field : fields) { + map.put(field.getName(), field); + } + return map; + } + /** * 获得一个类中所有字段列表,包括其父类中的字段 * @@ -350,12 +369,7 @@ public class ReflectUtil { */ public static List getPublicMethods(Class clazz, Method... excludeMethods) { final HashSet excludeMethodSet = CollectionUtil.newHashSet(excludeMethods); - return getPublicMethods(clazz, new Filter() { - @Override - public boolean accept(Method method) { - return false == excludeMethodSet.contains(method); - } - }); + return getPublicMethods(clazz, method -> false == excludeMethodSet.contains(method)); } /** @@ -367,12 +381,7 @@ public class ReflectUtil { */ public static List getPublicMethods(Class clazz, String... excludeMethodNames) { final HashSet excludeMethodNameSet = CollectionUtil.newHashSet(excludeMethodNames); - return getPublicMethods(clazz, new Filter() { - @Override - public boolean accept(Method method) { - return false == excludeMethodNameSet.contains(method.getName()); - } - }); + return getPublicMethods(clazz, method -> false == excludeMethodNameSet.contains(method.getName())); } /** @@ -770,7 +779,7 @@ public class ReflectUtil { */ public static T invokeWithCheck(Object obj, Method method, Object... args) throws UtilException { final Class[] types = method.getParameterTypes(); - if (null != types && null != args) { + if (null != args) { Assert.isTrue(args.length == types.length, "Params length [{}] is not fit for param length [{}] of method !", args.length, types.length); Class type; for (int i = 0; i < args.length; i++) { diff --git a/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java index 1dde71736..5b41e0a0c 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java @@ -2401,7 +2401,7 @@ public class StrUtil { Byte dataByte; for (int i = 0; i < data.length; i++) { dataByte = data[i]; - bytes[i] = (null == dataByte) ? -1 : dataByte.byteValue(); + bytes[i] = (null == dataByte) ? -1 : dataByte; } return str(bytes, charset); @@ -4018,8 +4018,8 @@ public class StrUtil { */ public static int totalLength(CharSequence... strs) { int totalLength = 0; - for (int i = 0; i < strs.length; i++) { - totalLength += (null == strs[i] ? 0 : strs[i].length()); + for (CharSequence str : strs) { + totalLength += (null == str ? 0 : str.length()); } return totalLength; } 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 77ee214a7..561e64927 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 @@ -38,12 +38,12 @@ public class FileUtilTest { String absolutePath2 = FileUtil.getAbsolutePath(absolutePath); Assert.assertNotNull(absolutePath2); Assert.assertEquals(absolutePath, absolutePath2); - } - @Test - public void getAbsolutePathTest2() { String path = FileUtil.getAbsolutePath("中文.xml"); Assert.assertTrue(path.contains("中文.xml")); + + path = FileUtil.getAbsolutePath("d:"); + Assert.assertEquals("d:", path); } @Test @@ -134,6 +134,7 @@ public class FileUtilTest { Assert.assertEquals("C:/bar", FileUtil.normalize("C:\\..\\bar")); Assert.assertEquals("bar", FileUtil.normalize("../../bar")); Assert.assertEquals("C:/bar", FileUtil.normalize("/C:/bar")); + Assert.assertEquals("C:", FileUtil.normalize("C:")); Assert.assertEquals("\\/192.168.1.1/Share/", FileUtil.normalize("\\\\192.168.1.1\\Share\\")); } From 7b81ebc64eec09fd8c2e652b056f84118f0c4635 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 2 Dec 2019 17:41:48 +0800 Subject: [PATCH 14/17] fix comment --- .../src/main/java/cn/hutool/cron/pattern/CronPattern.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hutool-cron/src/main/java/cn/hutool/cron/pattern/CronPattern.java b/hutool-cron/src/main/java/cn/hutool/cron/pattern/CronPattern.java index 4d355024b..a0e11407b 100644 --- a/hutool-cron/src/main/java/cn/hutool/cron/pattern/CronPattern.java +++ b/hutool-cron/src/main/java/cn/hutool/cron/pattern/CronPattern.java @@ -71,7 +71,7 @@ import cn.hutool.cron.pattern.parser.YearValueParser; *
      *
    • 5 * * * *:每个点钟的5分执行,00:05,01:05……
    • *
    • * * * * *:每分钟执行
    • - *
    • */2 * * * *:每两小时执行
    • + *
    • */2 * * * *:每两分钟执行
    • *
    • * 12 * * *:12点的每分钟执行
    • *
    • 59 11 * * 1,2:每周一和周二的11:59执行
    • *
    • 3-18/5 * * * *:3~18分,每5分钟执行一次,即0:03, 0:08, 0:13, 0:18, 1:03, 1:08……
    • From 19741683e9f47bd6d080ccc3db68a9e56aca2ec3 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 2 Dec 2019 17:47:08 +0800 Subject: [PATCH 15/17] fix comment --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e43c33b3c..1444c680a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ * 【db】 修复findLike匹配错误问题 * 【core 】 修复scale方法透明无效问题(issue#I15L5S@Gitee) * 【extra】 修复exec返回无效(issue#I15L5S@Gitee) +* 【cron】 修复CronPattern注释(pr#646@Github) ------------------------------------------------------------------------------------------------------------- From 432840be786e3e9369b14afb1f20def3376c3861 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 2 Dec 2019 18:21:10 +0800 Subject: [PATCH 16/17] fix LocalDateTime not support bug --- CHANGELOG.md | 1 + .../core/convert/impl/PrimitiveConverter.java | 87 ++++++++++++------- .../java/cn/hutool/json/InternalJSONUtil.java | 25 ++++-- .../main/java/cn/hutool/json/JSONUtil.java | 7 +- .../test/java/cn/hutool/json/Isse644Test.java | 32 +++++++ .../java/cn/hutool/json/JSONObjectTest.java | 13 ++- 6 files changed, 120 insertions(+), 45 deletions(-) create mode 100644 hutool-json/src/test/java/cn/hutool/json/Isse644Test.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 1444c680a..e2d0c4d0f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ * 【core 】 修复scale方法透明无效问题(issue#I15L5S@Gitee) * 【extra】 修复exec返回无效(issue#I15L5S@Gitee) * 【cron】 修复CronPattern注释(pr#646@Github) +* 【json】 修复LocalDateTime等JDK8时间对象不被支持的问题(issue#644@Github) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/PrimitiveConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/PrimitiveConverter.java index 13218ac0c..ee3a95f31 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/impl/PrimitiveConverter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/impl/PrimitiveConverter.java @@ -1,41 +1,46 @@ package cn.hutool.core.convert.impl; import cn.hutool.core.convert.AbstractConverter; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; +import java.time.temporal.TemporalAccessor; +import java.util.Calendar; +import java.util.Date; + /** * 原始类型转换器
      * 支持类型为:
      *
        *
      • byte
      • *
      • short
      • - *
      • int
      • - *
      • long
      • + *
      • int
      • + *
      • long
      • *
      • float
      • *
      • double
      • *
      • char
      • *
      • boolean
      • *
      - * - * @author Looly * + * @author Looly */ public class PrimitiveConverter extends AbstractConverter { private static final long serialVersionUID = 1L; - + private Class targetType; /** * 构造
      + * * @param clazz 需要转换的原始 * @throws IllegalArgumentException 传入的转换类型非原始类型时抛出 */ public PrimitiveConverter(Class clazz) { - if(null == clazz){ + if (null == clazz) { throw new NullPointerException("PrimitiveConverter not allow null target type!"); - }else if(false == clazz.isPrimitive()){ + } else if (false == clazz.isPrimitive()) { throw new IllegalArgumentException("[" + clazz + "] is not a primitive class!"); } this.targetType = clazz; @@ -47,80 +52,95 @@ public class PrimitiveConverter extends AbstractConverter { if (byte.class == this.targetType) { if (value instanceof Number) { return ((Number) value).byteValue(); - } else if(value instanceof Boolean) { - return BooleanUtil.toByte((Boolean)value); + } else if (value instanceof Boolean) { + return BooleanUtil.toByte((Boolean) value); } final String valueStr = convertToStr(value); if (StrUtil.isBlank(valueStr)) { return 0; } return Byte.parseByte(valueStr); - + } else if (short.class == this.targetType) { if (value instanceof Number) { return ((Number) value).shortValue(); - } else if(value instanceof Boolean) { - return BooleanUtil.toShort((Boolean)value); + } else if (value instanceof Boolean) { + return BooleanUtil.toShort((Boolean) value); } final String valueStr = convertToStr(value); if (StrUtil.isBlank(valueStr)) { return 0; } return Short.parseShort(valueStr); - + } else if (int.class == this.targetType) { if (value instanceof Number) { return ((Number) value).intValue(); - } else if(value instanceof Boolean) { - return BooleanUtil.toInt((Boolean)value); + } else if (value instanceof Boolean) { + return BooleanUtil.toInt((Boolean) value); + } else if (value instanceof Date) { + return ((Date) value).getTime(); + } else if (value instanceof Calendar) { + return ((Calendar) value).getTimeInMillis(); + } else if (value instanceof TemporalAccessor) { + return DateUtil.toInstant((TemporalAccessor) value).toEpochMilli(); } + final String valueStr = convertToStr(value); if (StrUtil.isBlank(valueStr)) { return 0; } return NumberUtil.parseInt(valueStr); - + } else if (long.class == this.targetType) { if (value instanceof Number) { return ((Number) value).longValue(); - } else if(value instanceof Boolean) { - return BooleanUtil.toLong((Boolean)value); + } else if (value instanceof Boolean) { + return BooleanUtil.toLong((Boolean) value); + } else if (value instanceof Date) { + return ((Date) value).getTime(); + } else if (value instanceof Calendar) { + return ((Calendar) value).getTimeInMillis(); + } else if (value instanceof TemporalAccessor) { + return DateUtil.toInstant((TemporalAccessor) value).toEpochMilli(); } + final String valueStr = convertToStr(value); if (StrUtil.isBlank(valueStr)) { return 0; } return NumberUtil.parseLong(valueStr); - + } else if (float.class == this.targetType) { if (value instanceof Number) { return ((Number) value).floatValue(); - } else if(value instanceof Boolean) { - return BooleanUtil.toFloat((Boolean)value); + } else if (value instanceof Boolean) { + return BooleanUtil.toFloat((Boolean) value); } final String valueStr = convertToStr(value); if (StrUtil.isBlank(valueStr)) { return 0; } return Float.parseFloat(valueStr); - + } else if (double.class == this.targetType) { if (value instanceof Number) { return ((Number) value).doubleValue(); - } else if(value instanceof Boolean) { - return BooleanUtil.toDouble((Boolean)value); + } else if (value instanceof Boolean) { + return BooleanUtil.toDouble((Boolean) value); } final String valueStr = convertToStr(value); if (StrUtil.isBlank(valueStr)) { return 0; } return Double.parseDouble(valueStr); - + } else if (char.class == this.targetType) { - if(value instanceof Character){ - return ((Character)value).charValue(); - } else if(value instanceof Boolean) { - return BooleanUtil.toChar((Boolean)value); + if (value instanceof Character) { + //noinspection UnnecessaryUnboxing + return ((Character) value).charValue(); + } else if (value instanceof Boolean) { + return BooleanUtil.toChar((Boolean) value); } final String valueStr = convertToStr(value); if (StrUtil.isBlank(valueStr)) { @@ -128,8 +148,9 @@ public class PrimitiveConverter extends AbstractConverter { } return valueStr.charAt(0); } else if (boolean.class == this.targetType) { - if(value instanceof Boolean){ - return ((Boolean)value).booleanValue(); + if (value instanceof Boolean) { + //noinspection UnnecessaryUnboxing + return ((Boolean) value).booleanValue(); } String valueStr = convertToStr(value); return BooleanUtil.toBoolean(valueStr); @@ -139,12 +160,12 @@ public class PrimitiveConverter extends AbstractConverter { } return 0; } - + @Override protected String convertToStr(Object value) { return StrUtil.trim(super.convertToStr(value)); } - + @Override @SuppressWarnings("unchecked") public Class getTargetType() { 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 5e1a13c12..a1b50f084 100644 --- a/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java +++ b/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java @@ -2,6 +2,7 @@ package cn.hutool.json; import java.io.IOException; import java.io.Writer; +import java.time.temporal.TemporalAccessor; import java.util.Calendar; import java.util.Collection; import java.util.Date; @@ -43,12 +44,12 @@ final class InternalJSONUtil { } else if (value instanceof JSON) { ((JSON) value).write(writer, indentFactor, indent); } else if (value instanceof Map) { - new JSONObject((Map) value).write(writer, indentFactor, indent); + new JSONObject(value).write(writer, indentFactor, indent); } else if (value instanceof Iterable || value instanceof Iterator || value.getClass().isArray()) { new JSONArray(value).write(writer, indentFactor, indent); } else if (value instanceof Number) { writer.write(NumberUtil.toStr((Number) value)); - } else if (value instanceof Date || value instanceof Calendar) { + } else if (value instanceof Date || value instanceof Calendar || value instanceof TemporalAccessor) { final String format = (null == config) ? null : config.getDateFormat(); writer.write(formatDate(value, format)); } else if (value instanceof Boolean) { @@ -138,7 +139,6 @@ final class InternalJSONUtil { * @return A simple JSON value. */ protected static Object stringToValue(String string) { - Double d; if (null == string || "null".equalsIgnoreCase(string)) { return JSONNull.NULL; } @@ -158,8 +158,8 @@ final class InternalJSONUtil { if ((b >= '0' && b <= '9') || b == '-') { try { if (string.indexOf('.') > -1 || string.indexOf('e') > -1 || string.indexOf('E') > -1) { - d = Double.valueOf(string); - if (!d.isInfinite() && !d.isNaN()) { + double d = Double.parseDouble(string); + if (false == Double.isInfinite(d) && false == Double.isNaN(d)) { return d; } } else { @@ -228,12 +228,21 @@ final class InternalJSONUtil { */ private static String formatDate(Object dateObj, String format) { if (StrUtil.isNotBlank(format)) { - final Date date = (dateObj instanceof Date) ? (Date) dateObj : ((Calendar) dateObj).getTime(); //用户定义了日期格式 - return JSONUtil.quote(DateUtil.format(date, format)); + return JSONUtil.quote(DateUtil.format(Convert.toDate(dateObj), format)); } //默认使用时间戳 - return String.valueOf((dateObj instanceof Date) ? ((Date) dateObj).getTime() : ((Calendar) dateObj).getTimeInMillis()); + long timeMillis; + if(dateObj instanceof TemporalAccessor){ + timeMillis = DateUtil.toInstant((TemporalAccessor)dateObj).toEpochMilli(); + } else if(dateObj instanceof Date){ + timeMillis = ((Date) dateObj).getTime(); + } else if(dateObj instanceof Calendar){ + timeMillis = ((Calendar) dateObj).getTimeInMillis(); + } else{ + throw new UnsupportedOperationException("Unsupported Date type: " + dateObj.getClass()); + } + return String.valueOf(timeMillis); } } 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 e94ff2c75..25a3e5bd6 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java @@ -6,6 +6,8 @@ import java.io.StringWriter; import java.io.Writer; import java.lang.reflect.Type; import java.nio.charset.Charset; +import java.time.LocalDateTime; +import java.time.temporal.TemporalAccessor; import java.util.Calendar; import java.util.Collection; import java.util.Date; @@ -650,7 +652,10 @@ public final class JSONUtil { } // 日期类型原样保存,便于格式化 - if (object instanceof Date || object instanceof Calendar) { + if (object instanceof Date + || object instanceof Calendar + || object instanceof TemporalAccessor + ) { return object; } // 枚举类保存其字符串形式(4.0.2新增) diff --git a/hutool-json/src/test/java/cn/hutool/json/Isse644Test.java b/hutool-json/src/test/java/cn/hutool/json/Isse644Test.java new file mode 100644 index 000000000..3b59e410d --- /dev/null +++ b/hutool-json/src/test/java/cn/hutool/json/Isse644Test.java @@ -0,0 +1,32 @@ +package cn.hutool.json; + +import lombok.Data; +import org.junit.Assert; +import org.junit.Test; + +import java.time.LocalDateTime; + +/** + * 问题反馈对象中有JDK8日期对象时转换失败,5.0.7修复 + */ +public class Isse644Test { + + @Test + public void toBeanTest(){ + final BeanWithDate beanWithDate = new BeanWithDate(); + beanWithDate.setDate(LocalDateTime.now()); + + final JSONObject jsonObject = JSONUtil.parseObj(beanWithDate); + + BeanWithDate beanWithDate2 = JSONUtil.toBean(jsonObject, BeanWithDate.class); + Assert.assertEquals(beanWithDate.getDate(), beanWithDate2.getDate()); + + beanWithDate2 = JSONUtil.toBean(jsonObject.toString(), BeanWithDate.class); + Assert.assertEquals(beanWithDate.getDate(), beanWithDate2.getDate()); + } + + @Data + static class BeanWithDate{ + private LocalDateTime date; + } +} 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 d5db03c2b..5ca532c84 100644 --- a/hutool-json/src/test/java/cn/hutool/json/JSONObjectTest.java +++ b/hutool-json/src/test/java/cn/hutool/json/JSONObjectTest.java @@ -3,6 +3,7 @@ package cn.hutool.json; import java.math.BigDecimal; import java.util.Date; import java.util.List; +import java.util.Objects; import org.junit.Assert; import org.junit.Ignore; @@ -58,8 +59,8 @@ public class JSONObjectTest { */ @Test public void toStringTest3() { - JSONObject json = JSONUtil.createObj()// - .put("dateTime", DateUtil.parse("2019-05-02 22:12:01"))// + JSONObject json = Objects.requireNonNull(JSONUtil.createObj()// + .put("dateTime", DateUtil.parse("2019-05-02 22:12:01")))// .setDateFormat(DatePattern.NORM_DATE_PATTERN); Assert.assertEquals("{\"dateTime\":\"2019-05-02\"}", json.toString()); } @@ -67,9 +68,10 @@ public class JSONObjectTest { @Test public void toStringWithDateTest() { JSONObject json = JSONUtil.createObj().put("date", DateUtil.parse("2019-05-08 19:18:21")); + assert json != null; Assert.assertEquals("{\"date\":1557314301000}", json.toString()); - json = JSONUtil.createObj().put("date", DateUtil.parse("2019-05-08 19:18:21")).setDateFormat(DatePattern.NORM_DATE_PATTERN); + json = Objects.requireNonNull(JSONUtil.createObj().put("date", DateUtil.parse("2019-05-08 19:18:21"))).setDateFormat(DatePattern.NORM_DATE_PATTERN); Assert.assertEquals("{\"date\":\"2019-05-08\"}", json.toString()); } @@ -131,6 +133,7 @@ public class JSONObjectTest { Console.log(json2); } + @SuppressWarnings("ConstantConditions") @Test public void toBeanTest() { JSONObject subJson = JSONUtil.createObj().put("value1", "strValue1").put("value2", "234"); @@ -149,6 +152,7 @@ public class JSONObjectTest { Assert.assertEquals(TestEnum.TYPE_A, bean.getTestEnum()); } + @SuppressWarnings("ConstantConditions") @Test public void toBeanNullStrTest() { JSONObject json = JSONUtil.createObj()// @@ -217,6 +221,7 @@ public class JSONObjectTest { /** * 在JSON转Bean过程中,Bean中字段如果为父类定义的泛型类型,则应正确转换,此方法用于测试这类情况 */ + @SuppressWarnings("ConstantConditions") @Test public void toBeanTest6() { JSONObject json = JSONUtil.createObj().put("targetUrl", "http://test.com").put("success", "true").put("result", JSONUtil.createObj().put("token", "tokenTest").put("userId", "测试用户1")); @@ -271,6 +276,7 @@ public class JSONObjectTest { Assert.assertEquals(bean.toString(), bean2.toString()); } + @SuppressWarnings("ConstantConditions") @Test public void parseBeanTest3() { JSONObject json = JSONUtil.createObj().put("code", 22).put("data", "{\"jobId\": \"abc\", \"videoUrl\": \"http://a.com/a.mp4\"}"); @@ -310,6 +316,7 @@ public class JSONObjectTest { Assert.assertEquals(DateUtil.parse("2018-10-25"), bean.getDate()); } + @SuppressWarnings("ConstantConditions") @Test public void beanTransTest3() { JSONObject userAJson = JSONUtil.createObj().put("a", "AValue").put("name", "nameValue").put("date", "08:00:00"); From da0e696a62667693a832a9977e8d57b47853962a Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 2 Dec 2019 18:25:11 +0800 Subject: [PATCH 17/17] release 5.0.7 --- hutool-all/pom.xml | 2 +- hutool-aop/pom.xml | 2 +- hutool-bloomFilter/pom.xml | 2 +- hutool-bom/pom.xml | 2 +- hutool-cache/pom.xml | 2 +- hutool-captcha/pom.xml | 2 +- hutool-core/pom.xml | 2 +- hutool-cron/pom.xml | 2 +- hutool-crypto/pom.xml | 2 +- hutool-db/pom.xml | 2 +- hutool-dfa/pom.xml | 2 +- hutool-extra/pom.xml | 2 +- hutool-http/pom.xml | 2 +- hutool-json/pom.xml | 2 +- hutool-log/pom.xml | 2 +- hutool-poi/pom.xml | 2 +- hutool-script/pom.xml | 2 +- hutool-setting/pom.xml | 2 +- hutool-socket/pom.xml | 2 +- hutool-system/pom.xml | 2 +- pom.xml | 2 +- 21 files changed, 21 insertions(+), 21 deletions(-) diff --git a/hutool-all/pom.xml b/hutool-all/pom.xml index 9b8307bc1..312a204d7 100644 --- a/hutool-all/pom.xml +++ b/hutool-all/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.0.7-SNAPSHOT + 5.0.7 hutool-all diff --git a/hutool-aop/pom.xml b/hutool-aop/pom.xml index 17ad5dba5..b1588c53d 100644 --- a/hutool-aop/pom.xml +++ b/hutool-aop/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.0.7-SNAPSHOT + 5.0.7 hutool-aop diff --git a/hutool-bloomFilter/pom.xml b/hutool-bloomFilter/pom.xml index cecf6ebeb..d51aa0211 100644 --- a/hutool-bloomFilter/pom.xml +++ b/hutool-bloomFilter/pom.xml @@ -7,7 +7,7 @@ cn.hutool hutool-parent - 5.0.7-SNAPSHOT + 5.0.7 hutool-bloomFilter diff --git a/hutool-bom/pom.xml b/hutool-bom/pom.xml index 7e74c28d2..51dbe043f 100644 --- a/hutool-bom/pom.xml +++ b/hutool-bom/pom.xml @@ -7,7 +7,7 @@ cn.hutool hutool-parent - 5.0.7-SNAPSHOT + 5.0.7 hutool-bom diff --git a/hutool-cache/pom.xml b/hutool-cache/pom.xml index 551a28561..3c3c8eb79 100644 --- a/hutool-cache/pom.xml +++ b/hutool-cache/pom.xml @@ -7,7 +7,7 @@ cn.hutool hutool-parent - 5.0.7-SNAPSHOT + 5.0.7 hutool-cache diff --git a/hutool-captcha/pom.xml b/hutool-captcha/pom.xml index 7cdaed3c7..bd68635f5 100644 --- a/hutool-captcha/pom.xml +++ b/hutool-captcha/pom.xml @@ -7,7 +7,7 @@ cn.hutool hutool-parent - 5.0.7-SNAPSHOT + 5.0.7 hutool-captcha diff --git a/hutool-core/pom.xml b/hutool-core/pom.xml index d7e551b52..268aa5795 100644 --- a/hutool-core/pom.xml +++ b/hutool-core/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.0.7-SNAPSHOT + 5.0.7 hutool-core diff --git a/hutool-cron/pom.xml b/hutool-cron/pom.xml index 7b9822dfc..20064fbdb 100644 --- a/hutool-cron/pom.xml +++ b/hutool-cron/pom.xml @@ -7,7 +7,7 @@ cn.hutool hutool-parent - 5.0.7-SNAPSHOT + 5.0.7 hutool-cron diff --git a/hutool-crypto/pom.xml b/hutool-crypto/pom.xml index f8d3e15ab..8fb1227f3 100644 --- a/hutool-crypto/pom.xml +++ b/hutool-crypto/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.0.7-SNAPSHOT + 5.0.7 hutool-crypto diff --git a/hutool-db/pom.xml b/hutool-db/pom.xml index f54aa6786..100fe3a14 100644 --- a/hutool-db/pom.xml +++ b/hutool-db/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.0.7-SNAPSHOT + 5.0.7 hutool-db diff --git a/hutool-dfa/pom.xml b/hutool-dfa/pom.xml index 7cf11503a..fdd33da4c 100644 --- a/hutool-dfa/pom.xml +++ b/hutool-dfa/pom.xml @@ -7,7 +7,7 @@ cn.hutool hutool-parent - 5.0.7-SNAPSHOT + 5.0.7 hutool-dfa diff --git a/hutool-extra/pom.xml b/hutool-extra/pom.xml index cd44ac3cc..745647a49 100644 --- a/hutool-extra/pom.xml +++ b/hutool-extra/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.0.7-SNAPSHOT + 5.0.7 hutool-extra diff --git a/hutool-http/pom.xml b/hutool-http/pom.xml index 4b28a3a3a..22a2e63bc 100644 --- a/hutool-http/pom.xml +++ b/hutool-http/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.0.7-SNAPSHOT + 5.0.7 hutool-http diff --git a/hutool-json/pom.xml b/hutool-json/pom.xml index 426641446..49a930a84 100644 --- a/hutool-json/pom.xml +++ b/hutool-json/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.0.7-SNAPSHOT + 5.0.7 hutool-json diff --git a/hutool-log/pom.xml b/hutool-log/pom.xml index bb5aaa25e..110f194ae 100644 --- a/hutool-log/pom.xml +++ b/hutool-log/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.0.7-SNAPSHOT + 5.0.7 hutool-log diff --git a/hutool-poi/pom.xml b/hutool-poi/pom.xml index a4fe791ad..5b1092f18 100644 --- a/hutool-poi/pom.xml +++ b/hutool-poi/pom.xml @@ -8,7 +8,7 @@ cn.hutool hutool-parent - 5.0.7-SNAPSHOT + 5.0.7 hutool-poi diff --git a/hutool-script/pom.xml b/hutool-script/pom.xml index e33cf7560..5d230e4b8 100644 --- a/hutool-script/pom.xml +++ b/hutool-script/pom.xml @@ -7,7 +7,7 @@ cn.hutool hutool-parent - 5.0.7-SNAPSHOT + 5.0.7 hutool-script diff --git a/hutool-setting/pom.xml b/hutool-setting/pom.xml index 56116d43f..ce5fc751f 100644 --- a/hutool-setting/pom.xml +++ b/hutool-setting/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.0.7-SNAPSHOT + 5.0.7 hutool-setting diff --git a/hutool-socket/pom.xml b/hutool-socket/pom.xml index 186cd7c62..cd3ab534a 100644 --- a/hutool-socket/pom.xml +++ b/hutool-socket/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.0.7-SNAPSHOT + 5.0.7 hutool-socket diff --git a/hutool-system/pom.xml b/hutool-system/pom.xml index b2fd43f07..5c3d3be94 100644 --- a/hutool-system/pom.xml +++ b/hutool-system/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.0.7-SNAPSHOT + 5.0.7 hutool-system diff --git a/pom.xml b/pom.xml index 7d8546cef..842e40605 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ cn.hutool hutool-parent - 5.0.7-SNAPSHOT + 5.0.7 hutool 提供丰富的Java工具方法 https://github.com/looly/hutool