From 7cf1b3758da12fbd90f5b898419957feed5b02b9 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 16 Jun 2022 13:36:07 +0800 Subject: [PATCH] add methods --- .../cn/hutool/core/collection/CollUtil.java | 3 +++ .../cn/hutool/core/collection/ListUtil.java | 15 +++++++++++ .../cn/hutool/core/collection/SetUtil.java | 15 +++++++++++ .../core/convert/impl/NumberConverter.java | 25 +++++++++++-------- .../cn/hutool/core/convert/ConvertTest.java | 6 +++++ .../java/cn/hutool/core/map/MapUtilTest.java | 5 ++-- .../cn/hutool/core/util/NumberUtilTest.java | 6 +++++ .../java/cn/hutool/core/util/ReUtilTest.java | 18 ++++++++++++- .../compress/extractor/StreamExtractor.java | 2 ++ .../java/cn/hutool/http/HttpResponse.java | 15 +++++++++++ .../main/java/cn/hutool/json/JSONParser.java | 2 ++ .../main/java/cn/hutool/poi/csv/CsvData.java | 5 ++-- 12 files changed, 101 insertions(+), 16 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java index 182e03ebb..988103e50 100755 --- a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java @@ -2440,6 +2440,9 @@ public class CollUtil { * @since 5.2.6 */ public static Collection unmodifiable(final Collection c) { + if(null == c){ + return null; + } return Collections.unmodifiableCollection(c); } diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java index 56b661c4f..212150da8 100755 --- a/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java @@ -609,4 +609,19 @@ public class ListUtil { } } } + + /** + * 转为只读List + * + * @param 元素类型 + * @param c 集合 + * @return 只读集合 + * @since 6.0.0 + */ + public static List unmodifiable(final List c) { + if (null == c) { + return null; + } + return Collections.unmodifiableList(c); + } } diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/SetUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/SetUtil.java index a80396d6e..fcb00fb91 100644 --- a/hutool-core/src/main/java/cn/hutool/core/collection/SetUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/SetUtil.java @@ -175,6 +175,21 @@ public class SetUtil { return Collections.emptySet(); } + /** + * 转为只读Set + * + * @param 元素类型 + * @param c 集合 + * @return 只读集合 + * @since 6.0.0 + */ + public static Set unmodifiable(final Set c) { + if (null == c) { + return null; + } + return Collections.unmodifiableSet(c); + } + /** * 新建一个HashSet * diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/NumberConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/NumberConverter.java index 1f1db1f61..5ba96e676 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/impl/NumberConverter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/impl/NumberConverter.java @@ -1,11 +1,12 @@ package cn.hutool.core.convert.impl; import cn.hutool.core.convert.AbstractConverter; +import cn.hutool.core.convert.ConvertException; import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.BooleanUtil; -import cn.hutool.core.util.ByteUtil; import cn.hutool.core.math.NumberUtil; import cn.hutool.core.text.StrUtil; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.ByteUtil; import java.math.BigDecimal; import java.math.BigInteger; @@ -50,7 +51,8 @@ public class NumberConverter extends AbstractConverter { @Override protected String convertToStr(final Object value) { final String result = StrUtil.trim(super.convertToStr(value)); - if (StrUtil.isNotEmpty(result)) { + if (null != result && result.length() > 1) { + // 非单个字符才判断末尾的标识符 final char c = Character.toUpperCase(result.charAt(result.length() - 1)); if (c == 'D' || c == 'L' || c == 'F') { // 类型标识形式(例如123.6D) @@ -58,6 +60,9 @@ public class NumberConverter extends AbstractConverter { } } + if(StrUtil.isEmpty(result)){ + throw new ConvertException("Can not convert empty value to Number!"); + } return result; } @@ -96,7 +101,7 @@ public class NumberConverter extends AbstractConverter { } final String valueStr = toStrFunc.apply(value); try{ - return StrUtil.isBlank(valueStr) ? null : Byte.valueOf(valueStr); + return Byte.valueOf(valueStr); } catch (final NumberFormatException e){ return NumberUtil.parseNumber(valueStr).byteValue(); } @@ -108,7 +113,7 @@ public class NumberConverter extends AbstractConverter { } final String valueStr = toStrFunc.apply((value)); try{ - return StrUtil.isBlank(valueStr) ? null : Short.valueOf(valueStr); + return Short.valueOf(valueStr); } catch (final NumberFormatException e){ return NumberUtil.parseNumber(valueStr).shortValue(); } @@ -125,7 +130,7 @@ public class NumberConverter extends AbstractConverter { return (int) DateUtil.toInstant((TemporalAccessor) value).toEpochMilli(); } final String valueStr = toStrFunc.apply((value)); - return StrUtil.isBlank(valueStr) ? null : NumberUtil.parseInt(valueStr); + return NumberUtil.parseInt(valueStr); } else if (AtomicInteger.class == targetType) { final Number number = convert(value, Integer.class, toStrFunc); if (null != number) { @@ -144,7 +149,7 @@ public class NumberConverter extends AbstractConverter { return DateUtil.toInstant((TemporalAccessor) value).toEpochMilli(); } final String valueStr = toStrFunc.apply((value)); - return StrUtil.isBlank(valueStr) ? null : NumberUtil.parseLong(valueStr); + return NumberUtil.parseLong(valueStr); } else if (AtomicLong.class == targetType) { final Number number = convert(value, Long.class, toStrFunc); if (null != number) { @@ -165,7 +170,7 @@ public class NumberConverter extends AbstractConverter { return BooleanUtil.toFloatObj((Boolean) value); } final String valueStr = toStrFunc.apply((value)); - return StrUtil.isBlank(valueStr) ? null : NumberUtil.parseFloat(valueStr); + return NumberUtil.parseFloat(valueStr); } else if (Double.class == targetType) { if (value instanceof Number) { return NumberUtil.toDouble((Number) value); @@ -173,7 +178,7 @@ public class NumberConverter extends AbstractConverter { return BooleanUtil.toDoubleObj((Boolean) value); } final String valueStr = toStrFunc.apply((value)); - return StrUtil.isBlank(valueStr) ? null : NumberUtil.parseDouble(valueStr); + return NumberUtil.parseDouble(valueStr); } else if (DoubleAdder.class == targetType) { //jdk8 新增 final Number number = convert(value, Double.class, toStrFunc); @@ -193,7 +198,7 @@ public class NumberConverter extends AbstractConverter { return BooleanUtil.toInteger((Boolean) value); } final String valueStr = toStrFunc.apply((value)); - return StrUtil.isBlank(valueStr) ? null : NumberUtil.parseNumber(valueStr); + return NumberUtil.parseNumber(valueStr); } throw new UnsupportedOperationException(StrUtil.format("Unsupport Number type: {}", targetType.getName())); diff --git a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java index daf07cf9a..c187d4dff 100755 --- a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java @@ -113,6 +113,12 @@ public class ConvertTest { Assert.assertEquals(Integer.valueOf(-1), aInt); } + @Test(expected = NumberFormatException.class) + public void toIntOfExceptionTest(){ + final Integer d = Convert.convert(Integer.class, "d"); + Assert.assertNotNull(d); + } + @Test public void toLongTest() { final String a = " 342324545435435"; diff --git a/hutool-core/src/test/java/cn/hutool/core/map/MapUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/map/MapUtilTest.java index 8454e69d2..fc37e2300 100644 --- a/hutool-core/src/test/java/cn/hutool/core/map/MapUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/map/MapUtilTest.java @@ -1,7 +1,6 @@ package cn.hutool.core.map; import cn.hutool.core.convert.Convert; -import cn.hutool.core.convert.ConvertException; import cn.hutool.core.lang.Opt; import cn.hutool.core.text.StrUtil; import lombok.Builder; @@ -217,9 +216,9 @@ public class MapUtilTest { Assert.assertEquals(Integer.valueOf(2), map.get("b")); } - @Test(expected = ConvertException.class) + @Test(expected = NumberFormatException.class) public void getIntTest(){ - final Map map = MapUtil.ofEntries(MapUtil.entry("a", "D")); + final Map map = MapUtil.ofEntries(MapUtil.entry("a", "d")); final Integer a = MapUtil.getInt(map, "a"); Assert.assertNotNull(a); } 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 c89dc1f1e..16bffe9bc 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 @@ -434,4 +434,10 @@ public class NumberUtilTest { //noinspection ResultOfMethodCallIgnored NumberUtil.range(0, Integer.MIN_VALUE); } + + @Test(expected = NumberFormatException.class) + public void parseIntTest3() { + int v1 = NumberUtil.parseInt("d"); + Assert.assertEquals(0, v1); + } } diff --git a/hutool-core/src/test/java/cn/hutool/core/util/ReUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/ReUtilTest.java index 6c9ee3cd0..5060ad10b 100755 --- a/hutool-core/src/test/java/cn/hutool/core/util/ReUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/ReUtilTest.java @@ -14,7 +14,7 @@ import java.util.Map; import java.util.regex.Pattern; public class ReUtilTest { - final String content = "ZZZaaabbbccc中文1234"; + static final String content = "ZZZaaabbbccc中文1234"; @Test public void getTest() { @@ -144,6 +144,22 @@ public class ReUtilTest { Assert.assertEquals("我有个\\$符号\\{\\}", escape); } + @Test + public void escapeTest2(){ + final String str = "a[bbbc"; + final String re = "["; + final String s = ReUtil.get(ReUtil.escape(re), str, 0); + Assert.assertEquals("[", s); + } + + @Test + public void escapeTest3(){ + final String context = "{prefix}_"; + final String regex = "{prefix}_"; + final boolean b = ReUtil.isMatch(ReUtil.escape(regex), context); + Assert.assertTrue(b); + } + @Test public void getAllGroupsTest() { //转义给定字符串,为正则相关的特殊符号转义 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/compress/extractor/StreamExtractor.java b/hutool-extra/src/main/java/cn/hutool/extra/compress/extractor/StreamExtractor.java index e0a287f05..782ce5314 100755 --- a/hutool-extra/src/main/java/cn/hutool/extra/compress/extractor/StreamExtractor.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/compress/extractor/StreamExtractor.java @@ -75,6 +75,8 @@ public class StreamExtractor implements Extractor{ this.in = factory.createArchiveInputStream(archiverName, in); } } catch (final ArchiveException e) { + // issue#2384,如果报错可能持有文件句柄,导致无法删除文件 + IoUtil.close(in); throw new CompressException(e); } } diff --git a/hutool-http/src/main/java/cn/hutool/http/HttpResponse.java b/hutool-http/src/main/java/cn/hutool/http/HttpResponse.java index f2520e462..262c48d44 100755 --- a/hutool-http/src/main/java/cn/hutool/http/HttpResponse.java +++ b/hutool-http/src/main/java/cn/hutool/http/HttpResponse.java @@ -395,6 +395,21 @@ public class HttpResponse extends HttpBase implements Closeable { public long writeBody(final String targetFileOrDir) { return writeBody(FileUtil.file(targetFileOrDir)); } + + /** + * 设置主体字节码,一版用于拦截器修改响应内容
+ * 需在此方法调用前使用charset方法设置编码,否则使用默认编码UTF-8 + * + * @param bodyBytes 主体 + * @return this + */ + public HttpResponse body(final byte[] bodyBytes) { + sync(); + if (null != bodyBytes) { + this.bodyBytes = bodyBytes; + } + return this; + } // ---------------------------------------------------------------- Body end @Override diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONParser.java b/hutool-json/src/main/java/cn/hutool/json/JSONParser.java index 15c766b06..2788bce86 100755 --- a/hutool-json/src/main/java/cn/hutool/json/JSONParser.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONParser.java @@ -77,6 +77,8 @@ public class JSONParser { case ';': case ',': if (tokener.nextClean() == '}') { + // issue#2380 + // 尾后逗号(Trailing Commas),JSON中虽然不支持,但是ECMAScript 2017支持,此处做兼容。 return; } tokener.back(); diff --git a/hutool-poi/src/main/java/cn/hutool/poi/csv/CsvData.java b/hutool-poi/src/main/java/cn/hutool/poi/csv/CsvData.java index 73841ce2d..d7871090d 100755 --- a/hutool-poi/src/main/java/cn/hutool/poi/csv/CsvData.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/csv/CsvData.java @@ -1,7 +1,8 @@ package cn.hutool.poi.csv; +import cn.hutool.core.collection.ListUtil; + import java.io.Serializable; -import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -42,7 +43,7 @@ public class CsvData implements Iterable, Serializable { * @return the header row - might be {@code null} if no header exists */ public List getHeader() { - return Collections.unmodifiableList(this.header); + return ListUtil.unmodifiable(this.header); } /**