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 3829d254b0..71694ffe50 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 3499fec3bf..139774d680 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 ced85ad02e..aafd0b7a54 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/main/java/cn/hutool/core/util/ReflectUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java
index a18a0cc2c4..75c09d4189 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 1dde717367..5b41e0a0c7 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/main/java/cn/hutool/core/util/XmlUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/XmlUtil.java
index efbfb0fc11..33c50d5494 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/io/FileUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/io/FileUtilTest.java
index 77ee214a73..561e649271 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\\"));
}
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 fda651f73b..75b63e2540 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);
}
@@ -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
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 463e408269..c29d8583c7 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-cron/pom.xml b/hutool-cron/pom.xml
index 93e5a3728b..20064fbdb7 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
hutool-cron
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 4d355024b4..a0e11407b4 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……
diff --git a/hutool-crypto/pom.xml b/hutool-crypto/pom.xml
index 927a739f24..8fb1227f3b 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
hutool-crypto
diff --git a/hutool-db/pom.xml b/hutool-db/pom.xml
index 2aca2764d4..100fe3a14f 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
hutool-db
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 65f49d7ec4..471fc182c8 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 fb5318c51f..d31ddac1d5 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 c65140c325..ab90ffb6f7 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操作单元测试
diff --git a/hutool-dfa/pom.xml b/hutool-dfa/pom.xml
index 3fd7fefc16..fdd33da4ca 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
hutool-dfa
diff --git a/hutool-extra/pom.xml b/hutool-extra/pom.xml
index e2231e936f..745647a499 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
hutool-extra
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 20377d7d32..ff605b0a2f 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 25d613f9e0..12afd4dff5 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/mail/Mail.java b/hutool-extra/src/main/java/cn/hutool/extra/mail/Mail.java
index 4c9382f853..d3d2284a51 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 d4fe5f873f..adfd5bed0b 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/main/java/cn/hutool/extra/ssh/JschUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschUtil.java
index e777193dc2..55608f8900 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,13 +356,13 @@ public class JschUtil {
if (null == charset) {
charset = CharsetUtil.CHARSET_UTF_8;
}
- 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) {
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 532028402d..7565a68923 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-http/pom.xml b/hutool-http/pom.xml
index ee7ad6c608..22a2e63bc8 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
hutool-http
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 84c39ec360..57441ebb0f 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-json/pom.xml b/hutool-json/pom.xml
index d225c3e7e5..49a930a841 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
hutool-json
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 5e1a13c12d..a1b50f084b 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/JSONArray.java b/hutool-json/src/main/java/cn/hutool/json/JSONArray.java
index 49610bc68e..bd8bd5d851 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