提交 548abe67 编写于 作者: 勤为径苦作舟's avatar 勤为径苦作舟

fix: 调整 CollectionUtils.isAllEquals 和 CollectionUtils.isAllEqualsSameIndex 方法的逻辑

原本 isByValue 参数为 true 时,只会将基础类型、BigDecimal 和 BigInteger 转为字符串,现在会将所有类型转为字符串。Float、Double、BigDecimal 小数点后多余的 0 会被去除的逻辑保持不变。
上级 2a1a514b
...@@ -6,7 +6,6 @@ import lombok.extern.slf4j.Slf4j; ...@@ -6,7 +6,6 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.IteratorUtils; import org.apache.commons.collections4.IteratorUtils;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*; import java.util.*;
import java.util.function.Function; import java.util.function.Function;
...@@ -326,7 +325,7 @@ public class CollectionUtils { ...@@ -326,7 +325,7 @@ public class CollectionUtils {
throw new IllegalArgumentException("Objects: length should be greater than 0"); throw new IllegalArgumentException("Objects: length should be greater than 0");
} }
for (Object object : objects) { for (Object object : objects) {
if(isAnyEmpty(object)) { if (isAnyEmpty(object)) {
return true; return true;
} }
} }
...@@ -344,13 +343,14 @@ public class CollectionUtils { ...@@ -344,13 +343,14 @@ public class CollectionUtils {
} }
/** /**
* 基础类型和 BigDecimal、BigInteger 会被转换为 String,且小数点后无效的 0 会被去除 * 转为字符串,Float、Double、BigDecimal 小数点后多余的 0 会被去除
* *
* @param object 元素 * @param object 需转换的对象
* @param isByString 是否转换
* @return 字符串 * @return 字符串
*/ */
private static Object toStringByBasic(Object object, boolean isByValue) { private static Object stripTrailingZerosToString(Object object, boolean isByString) {
if (isByValue && (ClassUtils.isBasic(object) || object instanceof BigDecimal || object instanceof BigInteger)) { if (isByString) {
if (object instanceof Float || object instanceof Double || object instanceof BigDecimal) { if (object instanceof Float || object instanceof Double || object instanceof BigDecimal) {
object = new BigDecimal(object.toString()).stripTrailingZeros().toPlainString(); object = new BigDecimal(object.toString()).stripTrailingZeros().toPlainString();
} else { } else {
...@@ -363,12 +363,12 @@ public class CollectionUtils { ...@@ -363,12 +363,12 @@ public class CollectionUtils {
/** /**
* 是否 每个对象的每个元素都相等 * 是否 每个对象的每个元素都相等
* *
* @param isByValue 是否根据值来判断是否相等,基础类型和 BigDecimal、BigInteger 会被转换为 String,且小数点后无效的 0 会被去除 * @param isByString 是否根据 toString() 的值来判断是否相等,Float、Double、BigDecimal 小数点后多余的 0 会被去除
* @param continueFunction 对象何时不参与判断 * @param continueFunction 对象何时不参与判断
* @param objects 多个对象 * @param objects 多个对象
* @return 是否 每个对象的每个元素都相等 * @return 是否 每个对象的每个元素都相等
*/ */
public static boolean isAllEquals(boolean isByValue, Function<Object, Boolean> continueFunction, final Object... objects) { public static boolean isAllEquals(boolean isByString, Function<Object, Boolean> continueFunction, final Object... objects) {
if (objects == null) { if (objects == null) {
return true; return true;
} }
...@@ -395,7 +395,7 @@ public class CollectionUtils { ...@@ -395,7 +395,7 @@ public class CollectionUtils {
int i = 0; int i = 0;
while (iterator.hasNext()) { while (iterator.hasNext()) {
// 基础类型转为 String // 基础类型转为 String
Object nextObj = toStringByBasic(iterator.next(), isByValue); Object nextObj = stripTrailingZerosToString(iterator.next(), isByString);
// 首次判断前跳过第一次循环 // 首次判断前跳过第一次循环
if (prevObj == null && i == 0) { if (prevObj == null && i == 0) {
prevObj = nextObj; prevObj = nextObj;
...@@ -410,7 +410,7 @@ public class CollectionUtils { ...@@ -410,7 +410,7 @@ public class CollectionUtils {
} else if (object instanceof Iterable<?>) { } else if (object instanceof Iterable<?>) {
int i = 0; int i = 0;
for (Object o : (Iterable<?>) object) { for (Object o : (Iterable<?>) object) {
Object nextObj = toStringByBasic(o, isByValue); Object nextObj = stripTrailingZerosToString(o, isByString);
if (prevObj == null && i == 0) { if (prevObj == null && i == 0) {
prevObj = nextObj; prevObj = nextObj;
i = 1; i = 1;
...@@ -424,7 +424,7 @@ public class CollectionUtils { ...@@ -424,7 +424,7 @@ public class CollectionUtils {
} else if (object instanceof Object[]) { } else if (object instanceof Object[]) {
Object[] objects1 = (Object[]) object; Object[] objects1 = (Object[]) object;
for (int i = 0; i < objects1.length; i++) { for (int i = 0; i < objects1.length; i++) {
Object nextObj = toStringByBasic(objects1[i], isByValue); Object nextObj = stripTrailingZerosToString(objects1[i], isByString);
if (prevObj == null && i == 0) { if (prevObj == null && i == 0) {
prevObj = nextObj; prevObj = nextObj;
i = 1; i = 1;
...@@ -439,7 +439,7 @@ public class CollectionUtils { ...@@ -439,7 +439,7 @@ public class CollectionUtils {
Enumeration<?> enumeration = (Enumeration<?>) object; Enumeration<?> enumeration = (Enumeration<?>) object;
int i = 0; int i = 0;
while (enumeration.hasMoreElements()) { while (enumeration.hasMoreElements()) {
Object nextObj = toStringByBasic(enumeration.nextElement(), isByValue); Object nextObj = stripTrailingZerosToString(enumeration.nextElement(), isByString);
if (prevObj == null && i == 0) { if (prevObj == null && i == 0) {
prevObj = nextObj; prevObj = nextObj;
i = 1; i = 1;
...@@ -458,24 +458,24 @@ public class CollectionUtils { ...@@ -458,24 +458,24 @@ public class CollectionUtils {
/** /**
* 是否不满足 每个对象的每个元素都相等 * 是否不满足 每个对象的每个元素都相等
* *
* @param isByValue 是否根据值来判断是否相等,基础类型和 BigDecimal、BigInteger 会被转换为 String,且小数点后无效的 0 会被去除 * @param isByString 是否根据 toString() 的值来判断是否相等,Float、Double、BigDecimal 小数点后多余的 0 会被去除
* @param continueFunction 对象何时不参与判断 * @param continueFunction 对象何时不参与判断
* @param objects 多个对象 * @param objects 多个对象
* @return 是否不满足 每个对象的每个元素都相等 * @return 是否不满足 每个对象的每个元素都相等
*/ */
public static boolean isNotAllEquals(boolean isByValue, Function<Object, Boolean> continueFunction, final Object... objects) { public static boolean isNotAllEquals(boolean isByString, Function<Object, Boolean> continueFunction, final Object... objects) {
return !isAllEquals(isByValue, continueFunction, objects); return !isAllEquals(isByString, continueFunction, objects);
} }
/** /**
* 是否 每个对象的同一位置的元素都相等 * 是否 每个对象的同一位置的元素都相等
* *
* @param isByValue 是否根据值来判断是否相等,基础类型和 BigDecimal、BigInteger 会被转换为 String,且小数点后无效的 0 会被去除 * @param isByString 是否根据 toString() 的值来判断是否相等,Float、Double、BigDecimal 小数点后多余的 0 会被去除
* @param continueFunction 对象何时不参与判断 * @param continueFunction 对象何时不参与判断
* @param objects 多个对象 * @param objects 多个对象
* @return 是否 每个对象的同一位置的元素都相等 * @return 是否 每个对象的同一位置的元素都相等
*/ */
public static boolean isAllEqualsSameIndex(boolean isByValue, Function<Object, Boolean> continueFunction, final Object... objects) { public static boolean isAllEqualsSameIndex(boolean isByString, Function<Object, Boolean> continueFunction, final Object... objects) {
if (objects == null) { if (objects == null) {
return true; return true;
} }
...@@ -533,7 +533,7 @@ public class CollectionUtils { ...@@ -533,7 +533,7 @@ public class CollectionUtils {
int i = 0; int i = 0;
for (; iterator.hasNext(); i++) { for (; iterator.hasNext(); i++) {
// 基础类型转为 String // 基础类型转为 String
Object nextObj = toStringByBasic(iterator.next(), isByValue); Object nextObj = stripTrailingZerosToString(iterator.next(), isByString);
if (prevList.size() < i + 1) { if (prevList.size() < i + 1) {
prevList.add(nextObj); prevList.add(nextObj);
i = 1; i = 1;
...@@ -547,7 +547,7 @@ public class CollectionUtils { ...@@ -547,7 +547,7 @@ public class CollectionUtils {
} else if (object instanceof Iterable<?>) { } else if (object instanceof Iterable<?>) {
int i = 0; int i = 0;
for (Object o : (Iterable<?>) object) { for (Object o : (Iterable<?>) object) {
Object nextObj = toStringByBasic(o, isByValue); Object nextObj = stripTrailingZerosToString(o, isByString);
if (prevList.size() < i + 1) { if (prevList.size() < i + 1) {
prevList.add(nextObj); prevList.add(nextObj);
i = 1; i = 1;
...@@ -562,7 +562,7 @@ public class CollectionUtils { ...@@ -562,7 +562,7 @@ public class CollectionUtils {
} else if (object instanceof Object[]) { } else if (object instanceof Object[]) {
Object[] objects1 = (Object[]) object; Object[] objects1 = (Object[]) object;
for (int i = 0; i < objects1.length; i++) { for (int i = 0; i < objects1.length; i++) {
Object nextObj = toStringByBasic(objects1[i], isByValue); Object nextObj = stripTrailingZerosToString(objects1[i], isByString);
if (prevList.size() < i + 1) { if (prevList.size() < i + 1) {
prevList.add(nextObj); prevList.add(nextObj);
i = 1; i = 1;
...@@ -577,7 +577,7 @@ public class CollectionUtils { ...@@ -577,7 +577,7 @@ public class CollectionUtils {
Enumeration<?> enumeration = (Enumeration<?>) object; Enumeration<?> enumeration = (Enumeration<?>) object;
int i = 0; int i = 0;
for (; enumeration.hasMoreElements(); i++) { for (; enumeration.hasMoreElements(); i++) {
Object nextObj = toStringByBasic(enumeration.nextElement(), isByValue); Object nextObj = stripTrailingZerosToString(enumeration.nextElement(), isByString);
if (prevList.size() < i + 1) { if (prevList.size() < i + 1) {
prevList.add(nextObj); prevList.add(nextObj);
i = 1; i = 1;
...@@ -596,12 +596,12 @@ public class CollectionUtils { ...@@ -596,12 +596,12 @@ public class CollectionUtils {
/** /**
* 是否不满足 每个对象的同一位置的元素都相等 * 是否不满足 每个对象的同一位置的元素都相等
* *
* @param isByValue 是否根据值来判断是否相等,基础类型和 BigDecimal、BigInteger 会被转换为 String,且小数点后无效的 0 会被去除 * @param isByString 是否根据 toString() 的值来判断是否相等,Float、Double、BigDecimal 小数点后多余的 0 会被去除
* @param continueFunction 对象何时不参与判断 * @param continueFunction 对象何时不参与判断
* @param objects 多个对象 * @param objects 多个对象
* @return 是否不满足 每个对象的同一位置的元素都相等 * @return 是否不满足 每个对象的同一位置的元素都相等
*/ */
public static boolean isNotAllEqualsSameIndex(boolean isByValue, Function<Object, Boolean> continueFunction, final Object... objects) { public static boolean isNotAllEqualsSameIndex(boolean isByString, Function<Object, Boolean> continueFunction, final Object... objects) {
return !isAllEqualsSameIndex(isByValue, continueFunction, objects); return !isAllEqualsSameIndex(isByString, continueFunction, objects);
} }
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册