This commit is contained in:
Looly 2022-08-16 10:36:30 +08:00
parent 4c62f40bb6
commit 1ca70d893d
7 changed files with 136 additions and 52 deletions

View File

@ -227,15 +227,20 @@ public class CollUtil {
} }
/** /**
* 是否包含{@code null}元素 * 是否包含{@code null}元素<br>
* <ul>
* <list>集合为{@code null}返回{@code true}</list>
* <list>集合为空集合即元素个数为0返回{@code false}</list>
* <list>集合中元素为""返回{@code false}</list>
* </ul>
* *
* @param iterable 被检查的Iterable对象如果为{@code null} 返回true * @param iterable 被检查的Iterable对象如果为{@code null} 返回true
* @return 是否包含{@code null}元素 * @return 是否包含{@code null}元素
* @see IterUtil#hasNull(Iterable) * @see IterUtil#hasNull(Iterator)
* @since 3.0.7 * @since 3.0.7
*/ */
public static boolean hasNull(final Iterable<?> iterable) { public static boolean hasNull(final Iterable<?> iterable) {
return IterUtil.hasNull(iterable); return IterUtil.hasNull(IterUtil.getIter(iterable));
} }
/** /**
@ -1359,6 +1364,10 @@ public class CollUtil {
* @return 第一个元素为空返回{@code null} * @return 第一个元素为空返回{@code null}
*/ */
public static <T> T getFirst(final Iterable<T> iterable) { public static <T> T getFirst(final Iterable<T> iterable) {
if (iterable instanceof List) {
final List<T> list = (List<T>) iterable;
return CollUtil.isEmpty(list) ? null: list.get(0);
}
return IterUtil.getFirst(IterUtil.getIter(iterable)); return IterUtil.getFirst(IterUtil.getIter(iterable));
} }

View File

@ -87,17 +87,12 @@ public class IterUtil {
} }
/** /**
* 是否包含{@code null}元素 * 是否包含{@code null}元素<br>
* * <ul>
* @param iter 被检查的{@link Iterable}对象如果为{@code null} 返回true * <list>Iterator为{@code null}返回{@code true}</list>
* @return 是否包含{@code null}元素 * <list>Iterator为空集合即元素个数为0返回{@code false}</list>
*/ * <list>Iterator中元素为""返回{@code false}</list>
public static boolean hasNull(final Iterable<?> iter) { * </ul>
return hasNull(null == iter ? null : iter.iterator());
}
/**
* 是否包含{@code null}元素
* *
* @param iter 被检查的{@link Iterator}对象如果为{@code null} 返回true * @param iter 被检查的{@link Iterator}对象如果为{@code null} 返回true
* @return 是否包含{@code null}元素 * @return 是否包含{@code null}元素

View File

@ -64,6 +64,9 @@ public class UTCDateParser extends DefaultDateBasic implements DateParser {
if (length == DatePattern.UTC_SIMPLE_PATTERN.length() - 2) { if (length == DatePattern.UTC_SIMPLE_PATTERN.length() - 2) {
// 格式类似2018-09-13T05:34:31 // 格式类似2018-09-13T05:34:31
return new DateTime(source, DatePattern.UTC_SIMPLE_FORMAT); return new DateTime(source, DatePattern.UTC_SIMPLE_FORMAT);
} else if (length == DatePattern.UTC_SIMPLE_PATTERN.length() - 5) {
// 格式类似2018-09-13T05:34
return new DateTime(source + ":00", DatePattern.UTC_SIMPLE_FORMAT);
} else if (StrUtil.contains(source, CharUtil.DOT)) { } else if (StrUtil.contains(source, CharUtil.DOT)) {
// 可能为 2021-03-17T06:31:33.99 // 可能为 2021-03-17T06:31:33.99
return new DateTime(source, DatePattern.UTC_SIMPLE_MS_FORMAT); return new DateTime(source, DatePattern.UTC_SIMPLE_MS_FORMAT);

View File

@ -267,7 +267,7 @@ public class NumberUtil {
} }
/** /**
* 补充Math.ceilDiv() JDK8中添加了和Math.floorDiv()但却没有ceilDiv() * 补充Math.ceilDiv() JDK8中添加了和 {@link Math#floorDiv(int, int)} 但却没有ceilDiv()
* *
* @param v1 被除数 * @param v1 被除数
* @param v2 除数 * @param v2 除数
@ -1448,6 +1448,7 @@ public class NumberUtil {
* 4空串返回0 * 4空串返回0
* 5.123形式返回0按照小于0的小数对待 * 5.123形式返回0按照小于0的小数对待
* 6123.56截取小数点之前的数字忽略小数部分 * 6123.56截取小数点之前的数字忽略小数部分
* 7科学计数法抛出NumberFormatException异常
* </pre> * </pre>
* *
* @param number 数字支持0x开头0开头和普通十进制 * @param number 数字支持0x开头0开头和普通十进制
@ -1460,6 +1461,11 @@ public class NumberUtil {
return 0; return 0;
} }
if(StrUtil.containsIgnoreCase(number, "E")){
// 科学计数法忽略支持科学计数法一般用于表示非常小和非常大的数字这类数字转换为int后精度丢失没有意义
throw new NumberFormatException(StrUtil.format("Unsupported int format: [{}]", number));
}
if (StrUtil.startWithIgnoreCase(number, "0x")) { if (StrUtil.startWithIgnoreCase(number, "0x")) {
// 0x04表示16进制数 // 0x04表示16进制数
return Integer.parseInt(number.substring(2), 16); return Integer.parseInt(number.substring(2), 16);

View File

@ -15,6 +15,7 @@ import lombok.ToString;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import java.util.ArrayDeque;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
@ -39,6 +40,34 @@ import java.util.function.Function;
*/ */
public class CollUtilTest { public class CollUtilTest {
@SuppressWarnings("ConstantConditions")
@Test
public void emptyIfNullTest() {
final Set<?> set = null;
final Set<?> set1 = CollUtil.emptyIfNull(set);
Assert.assertEquals(SetUtil.empty(), set1);
final List<?> list = null;
final List<?> list1 = CollUtil.emptyIfNull(list);
Assert.assertEquals(ListUtil.empty(), list1);
}
@SuppressWarnings("ConstantConditions")
@Test
public void hasNullTest() {
ArrayList<Object> list = null;
Assert.assertTrue(CollUtil.hasNull(list));
list = ListUtil.of();
Assert.assertFalse(CollUtil.hasNull(list));
list = ListUtil.of("");
Assert.assertFalse(CollUtil.hasNull(list));
list = ListUtil.of("", null);
Assert.assertTrue(CollUtil.hasNull(list));
}
@Test @Test
public void defaultIfEmpty() { public void defaultIfEmpty() {
ArrayList<String> strings = CollUtil.defaultIfEmpty(ListUtil.of(), ListUtil.of("1")); ArrayList<String> strings = CollUtil.defaultIfEmpty(ListUtil.of(), ListUtil.of("1"));
@ -50,7 +79,7 @@ public class CollUtilTest {
@Test @Test
public void defaultIfEmpty2() { public void defaultIfEmpty2() {
ArrayList<String> strings = CollUtil.defaultIfEmpty(ListUtil.of(), Function.identity(), () -> ListUtil.of("1")); final ArrayList<String> strings = CollUtil.defaultIfEmpty(ListUtil.of(), Function.identity(), () -> ListUtil.of("1"));
Assert.assertEquals(ListUtil.of("1"), strings); Assert.assertEquals(ListUtil.of("1"), strings);
} }
@ -322,7 +351,7 @@ public class CollUtilTest {
final List<String> removed = new ArrayList<>(); final List<String> removed = new ArrayList<>();
final ArrayList<String> filtered = CollUtil.remove(list, t -> { final ArrayList<String> filtered = CollUtil.remove(list, t -> {
if("a".equals(t)){ if ("a".equals(t)) {
removed.add(t); removed.add(t);
return true; return true;
} }
@ -484,8 +513,8 @@ public class CollUtilTest {
@Test @Test
public void listTest2() { public void listTest2() {
final List<String> list1 = ListUtil.of( "a", "b", "c"); final List<String> list1 = ListUtil.of("a", "b", "c");
final List<String> list2 = ListUtil.ofLinked( "a", "b", "c"); final List<String> list2 = ListUtil.ofLinked("a", "b", "c");
Assert.assertEquals("[a, b, c]", list1.toString()); Assert.assertEquals("[a, b, c]", list1.toString());
Assert.assertEquals("[a, b, c]", list2.toString()); Assert.assertEquals("[a, b, c]", list2.toString());
} }
@ -749,7 +778,7 @@ public class CollUtilTest {
} }
@Test @Test
public void mapToMapTest(){ public void mapToMapTest() {
final HashMap<String, String> oldMap = new HashMap<>(); final HashMap<String, String> oldMap = new HashMap<>();
oldMap.put("a", "1"); oldMap.put("a", "1");
oldMap.put("b", "12"); oldMap.put("b", "12");
@ -759,9 +788,9 @@ public class CollUtilTest {
Map.Entry::getKey, Map.Entry::getKey,
entry -> Long.parseLong(entry.getValue())); entry -> Long.parseLong(entry.getValue()));
Assert.assertEquals(1L, (long)map.get("a")); Assert.assertEquals(1L, (long) map.get("a"));
Assert.assertEquals(12L, (long)map.get("b")); Assert.assertEquals(12L, (long) map.get("b"));
Assert.assertEquals(134L, (long)map.get("c")); Assert.assertEquals(134L, (long) map.get("c"));
} }
@Test @Test
@ -826,7 +855,7 @@ public class CollUtilTest {
} }
@Test @Test
public void setValueByMapTest(){ public void setValueByMapTest() {
// https://gitee.com/dromara/hutool/pulls/482 // https://gitee.com/dromara/hutool/pulls/482
final List<Person> people = Arrays.asList( final List<Person> people = Arrays.asList(
new Person("aa", 12, "man", 1), new Person("aa", 12, "man", 1),
@ -867,13 +896,13 @@ public class CollUtilTest {
} }
@Test @Test
public void distinctTest(){ public void distinctTest() {
final ArrayList<Integer> distinct = CollUtil.distinct(ListUtil.view(5, 3, 10, 9, 0, 5, 10, 9)); final ArrayList<Integer> distinct = CollUtil.distinct(ListUtil.view(5, 3, 10, 9, 0, 5, 10, 9));
Assert.assertEquals(ListUtil.view(5, 3, 10, 9, 0), distinct); Assert.assertEquals(ListUtil.view(5, 3, 10, 9, 0), distinct);
} }
@Test @Test
public void distinctByFunctionTest(){ public void distinctByFunctionTest() {
final List<Person> people = Arrays.asList( final List<Person> people = Arrays.asList(
new Person("aa", 12, "man", 1), new Person("aa", 12, "man", 1),
new Person("bb", 13, "woman", 2), new Person("bb", 13, "woman", 2),
@ -906,14 +935,14 @@ public class CollUtilTest {
} }
@Test @Test
public void mapTest(){ public void mapTest() {
final ArrayList<String> list = ListUtil.of("a", "b", "c"); final ArrayList<String> list = ListUtil.of("a", "b", "c");
final List<Object> extract = CollUtil.map(list, (e) -> e + "_1"); final List<Object> extract = CollUtil.map(list, (e) -> e + "_1");
Assert.assertEquals(ListUtil.of("a_1", "b_1", "c_1"), extract); Assert.assertEquals(ListUtil.of("a_1", "b_1", "c_1"), extract);
} }
@Test @Test
public void mapBeanTest(){ public void mapBeanTest() {
final List<Person> people = Arrays.asList( final List<Person> people = Arrays.asList(
new Person("aa", 12, "man", 1), new Person("aa", 12, "man", 1),
new Person("bb", 13, "woman", 2), new Person("bb", 13, "woman", 2),
@ -926,14 +955,14 @@ public class CollUtilTest {
} }
@Test @Test
public void createTest(){ public void createTest() {
final Collection<Object> collection = CollUtil.create(Collections.emptyList().getClass()); final Collection<Object> collection = CollUtil.create(Collections.emptyList().getClass());
Console.log(collection.getClass()); Console.log(collection.getClass());
Assert.assertNotNull(collection); Assert.assertNotNull(collection);
} }
@Test @Test
public void transTest(){ public void transTest() {
final List<Person> people = Arrays.asList( final List<Person> people = Arrays.asList(
new Person("aa", 12, "man", 1), new Person("aa", 12, "man", 1),
new Person("bb", 13, "woman", 2), new Person("bb", 13, "woman", 2),
@ -945,6 +974,7 @@ public class CollUtilTest {
Assert.assertEquals("[aa, bb, cc, dd]", trans.toString()); Assert.assertEquals("[aa, bb, cc, dd]", trans.toString());
} }
@SuppressWarnings("ConstantConditions")
@Test @Test
public void unionNullTest() { public void unionNullTest() {
final List<String> list1 = new ArrayList<>(); final List<String> list1 = new ArrayList<>();
@ -954,6 +984,7 @@ public class CollUtilTest {
Assert.assertNotNull(union); Assert.assertNotNull(union);
} }
@SuppressWarnings("ConstantConditions")
@Test @Test
public void unionDistinctNullTest() { public void unionDistinctNullTest() {
final List<String> list1 = new ArrayList<>(); final List<String> list1 = new ArrayList<>();
@ -963,6 +994,7 @@ public class CollUtilTest {
Assert.assertNotNull(set); Assert.assertNotNull(set);
} }
@SuppressWarnings("ConstantConditions")
@Test @Test
public void unionAllNullTest() { public void unionAllNullTest() {
final List<String> list1 = new ArrayList<>(); final List<String> list1 = new ArrayList<>();
@ -972,6 +1004,7 @@ public class CollUtilTest {
Assert.assertNotNull(list); Assert.assertNotNull(list);
} }
@SuppressWarnings("ConstantConditions")
@Test @Test
public void intersectionNullTest() { public void intersectionNullTest() {
final List<String> list1 = new ArrayList<>(); final List<String> list1 = new ArrayList<>();
@ -983,6 +1016,7 @@ public class CollUtilTest {
Assert.assertNotNull(collection); Assert.assertNotNull(collection);
} }
@SuppressWarnings("ConstantConditions")
@Test @Test
public void intersectionDistinctNullTest() { public void intersectionDistinctNullTest() {
final List<String> list1 = new ArrayList<>(); final List<String> list1 = new ArrayList<>();
@ -1024,8 +1058,20 @@ public class CollUtilTest {
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Data @Data
static class Dog extends Animal { static class Dog extends Animal {
public Dog(String name, Integer age) { public Dog(final String name, final Integer age) {
super(name, age); super(name, age);
} }
} }
@Test
public void getFirstTest() {
Assert.assertNull(CollUtil.getFirst(null));
Assert.assertNull(CollUtil.getFirst(ListUtil.of()));
Assert.assertEquals("1", CollUtil.getFirst(ListUtil.of("1", "2", "3")));
final ArrayDeque<String> deque = new ArrayDeque<>();
deque.add("3");
deque.add("4");
Assert.assertEquals("3", CollUtil.getFirst(deque));
}
} }

View File

@ -682,6 +682,15 @@ public class DateUtilTest {
Assert.assertEquals("2021-03-30 12:56:51", Objects.requireNonNull(parse).toString()); Assert.assertEquals("2021-03-30 12:56:51", Objects.requireNonNull(parse).toString());
} }
@Test
public void parseUTCTest3() {
// issue#I5M6DP
final String dateStr = "2022-08-13T09:30";
final DateTime dateTime = DateUtil.parse(dateStr);
Assert.assertNotNull(dateTime);
Assert.assertEquals("2022-08-13 09:30:00", dateTime.toString());
}
@Test @Test
public void parseCSTTest() { public void parseCSTTest() {
final String dateStr = "Wed Sep 16 11:26:23 CST 2009"; final String dateStr = "Wed Sep 16 11:26:23 CST 2009";

View File

@ -12,7 +12,6 @@ import java.math.RoundingMode;
* {@link NumberUtil} 单元测试类 * {@link NumberUtil} 单元测试类
* *
* @author Looly * @author Looly
*
*/ */
public class NumberUtilTest { public class NumberUtilTest {
@ -50,7 +49,7 @@ public class NumberUtilTest {
} }
@Test @Test
public void addBlankTest(){ public void addBlankTest() {
final BigDecimal result = NumberUtil.add("123", " "); final BigDecimal result = NumberUtil.add("123", " ");
Assert.assertEquals(new BigDecimal("123"), result); Assert.assertEquals(new BigDecimal("123"), result);
} }
@ -74,7 +73,7 @@ public class NumberUtilTest {
} }
@Test @Test
public void mulNullTest(){ public void mulNullTest() {
final BigDecimal mul = NumberUtil.mul(new BigDecimal("10"), null); final BigDecimal mul = NumberUtil.mul(new BigDecimal("10"), null);
Assert.assertEquals(BigDecimal.ZERO, mul); Assert.assertEquals(BigDecimal.ZERO, mul);
} }
@ -206,7 +205,7 @@ public class NumberUtilTest {
} }
@Test(expected = IllegalArgumentException.class) @Test(expected = IllegalArgumentException.class)
public void decimalFormatNaNTest(){ public void decimalFormatNaNTest() {
final Double a = 0D; final Double a = 0D;
final Double b = 0D; final Double b = 0D;
@ -215,7 +214,7 @@ public class NumberUtilTest {
} }
@Test(expected = IllegalArgumentException.class) @Test(expected = IllegalArgumentException.class)
public void decimalFormatNaNTest2(){ public void decimalFormatNaNTest2() {
final Double a = 0D; final Double a = 0D;
final Double b = 0D; final Double b = 0D;
@ -300,6 +299,20 @@ public class NumberUtilTest {
Assert.assertEquals(1482, v1); Assert.assertEquals(1482, v1);
} }
@Test(expected = NumberFormatException.class)
public void parseIntTest3() {
final int v1 = NumberUtil.parseInt("d");
Assert.assertEquals(0, v1);
}
@Test(expected = NumberFormatException.class)
public void parseIntTest4() {
// issue#I5M55F
// 科学计数法忽略支持科学计数法一般用于表示非常小和非常大的数字这类数字转换为int后精度丢失没有意义
final String numberStr = "429900013E20220812163344551";
NumberUtil.parseInt(numberStr);
}
@Test @Test
public void parseNumberTest() { public void parseNumberTest() {
// from 5.4.8 issue#I23ORQ@Gitee // from 5.4.8 issue#I23ORQ@Gitee
@ -311,6 +324,15 @@ public class NumberUtilTest {
Assert.assertEquals(1482L, v2.longValue()); Assert.assertEquals(1482L, v2.longValue());
} }
@Test
public void parseNumberTest2() {
// issue#I5M55F
final String numberStr = "429900013E20220812163344551";
final Number number = NumberUtil.parseNumber(numberStr);
Assert.assertNotNull(number);
Assert.assertTrue(number instanceof BigDecimal);
}
@Test @Test
public void parseHexNumberTest() { public void parseHexNumberTest() {
// 千位分隔符去掉 // 千位分隔符去掉
@ -359,7 +381,7 @@ public class NumberUtilTest {
} }
@Test @Test
public void toStrTest(){ public void toStrTest() {
Assert.assertEquals("1", NumberUtil.toStr(new BigDecimal("1.0000000000"))); Assert.assertEquals("1", NumberUtil.toStr(new BigDecimal("1.0000000000")));
Assert.assertEquals("0", NumberUtil.toStr(NumberUtil.sub(new BigDecimal("9600.00000"), new BigDecimal("9600.00000")))); Assert.assertEquals("0", NumberUtil.toStr(NumberUtil.sub(new BigDecimal("9600.00000"), new BigDecimal("9600.00000"))));
Assert.assertEquals("0", NumberUtil.toStr(NumberUtil.sub(new BigDecimal("9600.0000000000"), new BigDecimal("9600.000000")))); Assert.assertEquals("0", NumberUtil.toStr(NumberUtil.sub(new BigDecimal("9600.0000000000"), new BigDecimal("9600.000000"))));
@ -367,15 +389,15 @@ public class NumberUtilTest {
} }
@Test @Test
public void toPlainNumberTest(){ public void toPlainNumberTest() {
final String num = "5344.34234e3"; final String num = "5344.34234e3";
final String s = new BigDecimal(num).toPlainString(); final String s = new BigDecimal(num).toPlainString();
Assert.assertEquals("5344342.34", s); Assert.assertEquals("5344342.34", s);
} }
@Test @Test
public void isOddOrEvenTest(){ public void isOddOrEvenTest() {
final int[] a = { 0, 32, -32, 123, -123 }; final int[] a = {0, 32, -32, 123, -123};
Assert.assertFalse(NumberUtil.isOdd(a[0])); Assert.assertFalse(NumberUtil.isOdd(a[0]));
Assert.assertTrue(NumberUtil.isEven(a[0])); Assert.assertTrue(NumberUtil.isEven(a[0]));
@ -393,21 +415,21 @@ public class NumberUtilTest {
} }
@Test @Test
public void toBigIntegerTest(){ public void toBigIntegerTest() {
final Number number=1123123; final Number number = 1123123;
final Number number2=1123123.123; final Number number2 = 1123123.123;
Assert.assertNotNull(NumberUtil.toBigInteger(number)); Assert.assertNotNull(NumberUtil.toBigInteger(number));
Assert.assertNotNull(NumberUtil.toBigInteger(number2)); Assert.assertNotNull(NumberUtil.toBigInteger(number2));
} }
@Test @Test
public void divIntegerTest(){ public void divIntegerTest() {
final BigDecimal div = NumberUtil.div(100101300, 100); final BigDecimal div = NumberUtil.div(100101300, 100);
Assert.assertEquals(1001013, div.intValue()); Assert.assertEquals(1001013, div.intValue());
} }
@Test @Test
public void isDoubleTest(){ public void isDoubleTest() {
Assert.assertFalse(NumberUtil.isDouble(null)); Assert.assertFalse(NumberUtil.isDouble(null));
Assert.assertFalse(NumberUtil.isDouble("")); Assert.assertFalse(NumberUtil.isDouble(""));
Assert.assertFalse(NumberUtil.isDouble(" ")); Assert.assertFalse(NumberUtil.isDouble(" "));
@ -434,10 +456,4 @@ public class NumberUtilTest {
//noinspection ResultOfMethodCallIgnored //noinspection ResultOfMethodCallIgnored
NumberUtil.range(0, Integer.MIN_VALUE); NumberUtil.range(0, Integer.MIN_VALUE);
} }
@Test(expected = NumberFormatException.class)
public void parseIntTest3() {
int v1 = NumberUtil.parseInt("d");
Assert.assertEquals(0, v1);
}
} }