add methods

This commit is contained in:
Looly 2022-06-16 13:36:07 +08:00
parent 8af2bd79f8
commit 7cf1b3758d
12 changed files with 101 additions and 16 deletions

View File

@ -2440,6 +2440,9 @@ public class CollUtil {
* @since 5.2.6
*/
public static <T> Collection<T> unmodifiable(final Collection<? extends T> c) {
if(null == c){
return null;
}
return Collections.unmodifiableCollection(c);
}

View File

@ -609,4 +609,19 @@ public class ListUtil {
}
}
}
/**
* 转为只读List
*
* @param <T> 元素类型
* @param c 集合
* @return 只读集合
* @since 6.0.0
*/
public static <T> List<T> unmodifiable(final List<? extends T> c) {
if (null == c) {
return null;
}
return Collections.unmodifiableList(c);
}
}

View File

@ -175,6 +175,21 @@ public class SetUtil {
return Collections.emptySet();
}
/**
* 转为只读Set
*
* @param <T> 元素类型
* @param c 集合
* @return 只读集合
* @since 6.0.0
*/
public static <T> Set<T> unmodifiable(final Set<? extends T> c) {
if (null == c) {
return null;
}
return Collections.unmodifiableSet(c);
}
/**
* 新建一个HashSet
*

View File

@ -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()));

View File

@ -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";

View File

@ -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<String, String> map = MapUtil.ofEntries(MapUtil.entry("a", "D"));
final Map<String, String> map = MapUtil.ofEntries(MapUtil.entry("a", "d"));
final Integer a = MapUtil.getInt(map, "a");
Assert.assertNotNull(a);
}

View File

@ -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);
}
}

View File

@ -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() {
//转义给定字符串为正则相关的特殊符号转义

View File

@ -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);
}
}

View File

@ -395,6 +395,21 @@ public class HttpResponse extends HttpBase<HttpResponse> implements Closeable {
public long writeBody(final String targetFileOrDir) {
return writeBody(FileUtil.file(targetFileOrDir));
}
/**
* 设置主体字节码一版用于拦截器修改响应内容<br>
* 需在此方法调用前使用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

View File

@ -77,6 +77,8 @@ public class JSONParser {
case ';':
case ',':
if (tokener.nextClean() == '}') {
// issue#2380
// 尾后逗号Trailing CommasJSON中虽然不支持但是ECMAScript 2017支持此处做兼容
return;
}
tokener.back();

View File

@ -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<CsvRow>, Serializable {
* @return the header row - might be {@code null} if no header exists
*/
public List<String> getHeader() {
return Collections.unmodifiableList(this.header);
return ListUtil.unmodifiable(this.header);
}
/**