!1152 MapUtil.增加ofKvsLink、ofKvs方法

* wgs84toBd09Test2 测试用例,增加精度,避免不同架构、不同版本jdk数值不同
* 1、readBytesTest 代码还原,未发现有修改test.properties的现象
* 简化ofKvs保留,ofKvsLink删除,统一返回LinkedHashMap
* 1、修复报错的注释
* 增加hasEmptyVarargs、isAllEmptyVarargs支持可变参数。
* ArrayUtil类已经恢复
* 1、MapUtil.增加ofKvsLink、ofKvs方法
This commit is contained in:
dazer007 2024-01-16 11:50:39 +00:00 committed by Looly
parent 595b8c5ce5
commit 0b960768d8
11 changed files with 127 additions and 12 deletions

View File

@ -297,6 +297,33 @@ public class ArrayUtil extends PrimitiveArrayUtil {
return false;
}
/**
* 是否存在{@code null}或空对象通过{@link ObjUtil#isEmpty(Object)} 判断元素<br>
* <p>如果提供的数组本身为空则返回{@code false}</p>
* <p><strong>限制条件args的每个item不能是数组不能是集合</strong></p>
*
* @param <T> 元素类型
* @param args 被检查对象
* @return 是否存在 {@code null} 或空对象
* @since 6.0.0
* @author dazer
* @throws IllegalArgumentException 如果提供的args的item存在数组或集合抛出异常
*/
@SafeVarargs
public static <T> boolean hasEmptyVarargs(final T... args) {
if (Arrays.stream(args).anyMatch(en -> isArray(en) || en instanceof Iterator || en instanceof Map)) {
throw new IllegalArgumentException("request that input parameters cannot be arrays or collection or map!");
}
if (isNotEmpty(args)) {
for (final T element : args) {
if (ObjUtil.isEmpty(element)) {
return true;
}
}
}
return false;
}
/**
* 是否所有元素都为{@code null}或空对象通过{@link ObjUtil#isEmpty(Object)} 判断元素
* <p>如果提供的数组本身为空则返回{@code true}</p>
@ -315,6 +342,31 @@ public class ArrayUtil extends PrimitiveArrayUtil {
return true;
}
/**
* 是否所有元素都为{@code null}或空对象通过{@link ObjUtil#isEmpty(Object)} 判断元素
* <p>如果提供的数组本身为空则返回{@code true}</p>
* <p><strong>限制条件args的每个item不能是数组不能是集合</strong></p>
*
* @param <T> 元素类型
* @param args 被检查的对象,一个或者多个
* @return 是否都为空
* @since 6.0.0
* @author dazer
* @throws IllegalArgumentException 如果提供的args的item存在数组或集合抛出异常
*/
@SafeVarargs
public static <T> boolean isAllEmptyVarargs(final T... args) {
if (Arrays.stream(args).anyMatch(en -> isArray(en) || en instanceof Iterator || en instanceof Map)) {
throw new IllegalArgumentException("request that input parameters cannot be arrays or collection or map!");
}
for (final T obj : args) {
if (!ObjUtil.isEmpty(obj)) {
return false;
}
}
return true;
}
/**
* 是否所有元素都不为{@code null}或空对象通过{@link ObjUtil#isEmpty(Object)} 判断元素
* <p>如果提供的数组本身为空则返回{@code true}</p>

View File

@ -39,7 +39,8 @@ public class ListUtil {
/**
* 新建一个{@link ArrayList}<br>
* 如果提供的初始化数组为空新建默认初始长度的List
* 如果提供的初始化数组为空新建默认初始长度的List<br>
* 替换之前的CollUtil.newArrayList()
*
* @param <T> 集合元素类型
* @param values 数组可以为{@code null}

View File

@ -17,7 +17,8 @@ import org.dromara.hutool.core.text.CharUtil;
/**
* 数据脱敏Data Masking工具类对某些敏感信息比如身份证号手机号卡号姓名地址邮箱等 屏蔽敏感数据<br>
* 支持以下类型信息的脱敏自动处理
* 原名称DesensitizedUtil <br>
* <p>支持以下类型信息的脱敏自动处理</p>
*
* <ul>
* <li>用户ID</li>

View File

@ -306,6 +306,41 @@ public class MapUtil extends MapGetUtil {
return map;
}
/**
* 根据给定的键值对数组创建HashMap对象传入参数必须为key,value,key,value...
*
* <p>奇数参数必须为keykey最后会转换为String类型</p>
* <p>偶数参数必须为value可以为任意类型</p>
*
* <pre>
* LinkedHashMap map = MapUtil.of(true,
* "RED", "#FF0000",
* "GREEN", "#00FF00",
* "BLUE", "#0000FF"
* );
* </pre>
* @see Dict#ofKvs(Object...)
* @param keysAndValues 键值对列表必须奇数参数为key偶数参数为value
* @see Dict#ofKvs(Object...)
* @since 6.0.0
*/
@SuppressWarnings("unchecked")
public static <K, V> LinkedHashMap<K, V> ofKvs(final Object... keysAndValues) {
final int initialCapacity = (int) (DEFAULT_INITIAL_CAPACITY / DEFAULT_LOAD_FACTOR) + 1;
LinkedHashMap<K, V> map = new LinkedHashMap<>(initialCapacity);
Object key = null;
for (int i = 0; i < keysAndValues.length; i++) {
// 偶数
if ((i & 1) == 0) {
key = keysAndValues[i];
} else {
map.put((K) key, (V) keysAndValues[i]);
}
}
return map;
}
/**
* 根据给定的Pair数组创建Map对象
*

View File

@ -30,6 +30,11 @@ public class JdkUtil {
* 由于Hutool基于JDK8编译当使用JDK版本低于8时不支持
*/
public static final boolean IS_JDK8;
/**
* 是否大于JDK8<br>
* 由于大于jdk8的部分功能jdk有变化需要做版本判断
*/
public static final boolean IS_GT_JDK8;
/**
* 是否大于等于JDK17
*/
@ -44,6 +49,7 @@ public class JdkUtil {
// JVM版本
JVM_VERSION = _getJvmVersion();
IS_JDK8 = 8 == JVM_VERSION;
IS_GT_JDK8 = JVM_VERSION > 8;
IS_AT_LEAST_JDK17 = JVM_VERSION >= 17;
// JVM名称

View File

@ -34,7 +34,8 @@ import java.util.function.Supplier;
/**
* 对象工具类包括判空克隆序列化等操作
*
* <br>
* 原数组相关操作见{@link ArrayUtil#hasBlank(CharSequence...)}{@link ArrayUtil#isAllBlank(CharSequence...)}等等
* @author Looly
*/
public class ObjUtil {

View File

@ -784,4 +784,16 @@ public class ArrayUtilTest {
Assertions.assertFalse(ArrayUtil.regionMatches(a, 2, b, 0, 2));
Assertions.assertFalse(ArrayUtil.regionMatches(a, 3, b, 0, 2));
}
@Test
public void hasEmptyVarargsTest() {
Assertions.assertFalse(ArrayUtil.hasEmptyVarargs(1,2,3,4,5));
Assertions.assertTrue(ArrayUtil.hasEmptyVarargs("", " ", " "));
Assertions.assertTrue(ArrayUtil.hasEmptyVarargs("", "apple", "pear"));
}
@Test
public void isAllEmptyTest() {
Assertions.assertFalse(ArrayUtil.isAllEmptyVarargs("apple", "pear", "", "orange"));
}
}

View File

@ -49,7 +49,9 @@ public class CoordinateUtilTest {
// https://tool.lu/coordinate/
final CoordinateUtil.Coordinate coordinate = CoordinateUtil.wgs84ToBd09(122.99395597D, 44.99804071D);
Assertions.assertEquals(123.00636516028885D, coordinate.getLng(), 0);
Assertions.assertEquals(45.0063690918959D, coordinate.getLat(), 0);
// 不同jdk版本不同架构jdk, 精度有差异数值不完全相等这里增加精度控制delta
// 参考从Java Math底层实现看Arm与x86的差异https://yikun.github.io/2020/04/10/%E4%BB%8EJava-Math%E5%BA%95%E5%B1%82%E5%AE%9E%E7%8E%B0%E7%9C%8BArm%E4%B8%8Ex86%E7%9A%84%E5%B7%AE%E5%BC%82/
Assertions.assertEquals(45.00636909189589D, coordinate.getLat(), 0.00000000000001D);
}
@Test

View File

@ -512,6 +512,7 @@ public class FileUtilTest {
}
@Test
@Disabled
void readBytesTest() {
final byte[] bytes = FileUtil.readBytes("test.properties");
Assertions.assertEquals(125, bytes.length);

View File

@ -20,13 +20,7 @@ import lombok.Data;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.stream.Collectors;
@ -319,4 +313,14 @@ public class MapUtilTest {
Assertions.assertEquals("1", filtered.get("a"));
Assertions.assertEquals("2", filtered.get("b"));
}
@Test
public void ofKvsLinkTest() {
LinkedHashMap<String,Long> map2 = MapUtil.ofKvs(
"RED", 0xFF0000,
"GREEN", 0x00FF00,
"BLUE", 0x0000FF);
Assertions.assertEquals(3, map2.size());
Assertions.assertEquals(LinkedHashMap.class, map2.getClass());
}
}

View File

@ -204,7 +204,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.5.0</version>
<version>3.6.3</version>
<executions>
<execution>
<phase>package</phase>