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);
} }
@ -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 {
@ -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() {
// 千位分隔符去掉 // 千位分隔符去掉
@ -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);
}
} }