From 106ea5a7592bbfb1cf96436cc2d3b017741b5ac8 Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 20 Nov 2019 00:15:52 +0800 Subject: [PATCH] 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();