This commit is contained in:
Looly 2019-11-26 11:21:34 +08:00
parent de80af155c
commit 83460af7ef
18 changed files with 192 additions and 140 deletions

View File

@ -8,11 +8,14 @@
### 新特性 ### 新特性
* 【core 】 解决NumberUtil导致的ambiguous问题issue#630@Github * 【core 】 解决NumberUtil导致的ambiguous问题issue#630@Github
* 【core 】 BeanUtil.isEmpty()忽略字段支持增加isNotEmptyissue#629@Github * 【core 】 BeanUtil.isEmpty()忽略字段支持增加isNotEmptyissue#629@Github
* 【extra 】 邮件发送后获取message-idissue#I15FKR@Gitee * 【extra】 邮件发送后获取message-idissue#I15FKR@Gitee
* 【core 】 CaseInsensitiveMap/CamelCaseMap增加toStringissue#636@Github
* 【core 】 XmlUtil多节点改进issue#I15I0R@Gitee
### Bug修复 ### Bug修复
* 【extra】 修复SFTP.upload上传失败的问题 * 【extra】 修复SFTP.upload上传失败的问题
* 【db】 修复findLike匹配错误问题 * 【db】 修复findLike匹配错误问题
* 【core 】 修复scale方法透明无效问题issue#I15L5S@Gitee
------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------

View File

@ -4,6 +4,8 @@ import java.lang.reflect.Type;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.BigInteger; import java.math.BigInteger;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.time.Instant;
import java.time.LocalDateTime;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -445,6 +447,34 @@ public class Convert {
return convertQuietly(Date.class, value, defaultValue); return convertQuietly(Date.class, value, defaultValue);
} }
/**
* LocalDateTime<br>
* 如果给定的值为空或者转换失败返回默认值<br>
* 转换失败不会报错
*
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
* @since 5.0.7
*/
public static Date toLocalDateTime(Object value, Date defaultValue) {
return convertQuietly(LocalDateTime.class, value, defaultValue);
}
/**
* Instant<br>
* 如果给定的值为空或者转换失败返回默认值<br>
* 转换失败不会报错
*
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
* @since 5.0.7
*/
public static Date toInstant(Object value, Date defaultValue) {
return convertQuietly(Instant.class, value, defaultValue);
}
/** /**
* 转换为Date<br> * 转换为Date<br>
* 如果给定的值为空或者转换失败返回<code>null</code><br> * 如果给定的值为空或者转换失败返回<code>null</code><br>

View File

@ -10,12 +10,12 @@ import cn.hutool.core.convert.Convert;
* 基本类型的getter接口抽象实现所有类型的值获取都是通过将getObj获得的值转换而来<br> * 基本类型的getter接口抽象实现所有类型的值获取都是通过将getObj获得的值转换而来<br>
* 用户只需实现getObj方法即可其他类型将会从Object结果中转换 * 用户只需实现getObj方法即可其他类型将会从Object结果中转换
* 在不提供默认值的情况下 如果值不存在或获取错误返回null<br> * 在不提供默认值的情况下 如果值不存在或获取错误返回null<br>
*
* @author Looly * @author Looly
*/ */
public abstract class OptNullBasicTypeFromObjectGetter<K> extends OptNullBasicTypeGetter<K>{ public interface OptNullBasicTypeFromObjectGetter<K> extends OptNullBasicTypeGetter<K>{
@Override default String getStr(K key, String defaultValue) {
public String getStr(K key, String defaultValue) {
final Object obj = getObj(key); final Object obj = getObj(key);
if(null == obj) { if(null == obj) {
return defaultValue; return defaultValue;
@ -23,8 +23,7 @@ public abstract class OptNullBasicTypeFromObjectGetter<K> extends OptNullBasicTy
return Convert.toStr(obj, defaultValue); return Convert.toStr(obj, defaultValue);
} }
@Override default Integer getInt(K key, Integer defaultValue) {
public Integer getInt(K key, Integer defaultValue) {
final Object obj = getObj(key); final Object obj = getObj(key);
if(null == obj) { if(null == obj) {
return defaultValue; return defaultValue;
@ -32,8 +31,7 @@ public abstract class OptNullBasicTypeFromObjectGetter<K> extends OptNullBasicTy
return Convert.toInt(obj, defaultValue); return Convert.toInt(obj, defaultValue);
} }
@Override default Short getShort(K key, Short defaultValue) {
public Short getShort(K key, Short defaultValue) {
final Object obj = getObj(key); final Object obj = getObj(key);
if(null == obj) { if(null == obj) {
return defaultValue; return defaultValue;
@ -41,8 +39,7 @@ public abstract class OptNullBasicTypeFromObjectGetter<K> extends OptNullBasicTy
return Convert.toShort(obj, defaultValue); return Convert.toShort(obj, defaultValue);
} }
@Override default Boolean getBool(K key, Boolean defaultValue) {
public Boolean getBool(K key, Boolean defaultValue) {
final Object obj = getObj(key); final Object obj = getObj(key);
if(null == obj) { if(null == obj) {
return defaultValue; return defaultValue;
@ -50,8 +47,7 @@ public abstract class OptNullBasicTypeFromObjectGetter<K> extends OptNullBasicTy
return Convert.toBool(obj, defaultValue); return Convert.toBool(obj, defaultValue);
} }
@Override default Long getLong(K key, Long defaultValue) {
public Long getLong(K key, Long defaultValue) {
final Object obj = getObj(key); final Object obj = getObj(key);
if(null == obj) { if(null == obj) {
return defaultValue; return defaultValue;
@ -59,8 +55,7 @@ public abstract class OptNullBasicTypeFromObjectGetter<K> extends OptNullBasicTy
return Convert.toLong(obj, defaultValue); return Convert.toLong(obj, defaultValue);
} }
@Override default Character getChar(K key, Character defaultValue) {
public Character getChar(K key, Character defaultValue) {
final Object obj = getObj(key); final Object obj = getObj(key);
if(null == obj) { if(null == obj) {
return defaultValue; return defaultValue;
@ -68,8 +63,7 @@ public abstract class OptNullBasicTypeFromObjectGetter<K> extends OptNullBasicTy
return Convert.toChar(obj, defaultValue); return Convert.toChar(obj, defaultValue);
} }
@Override default Float getFloat(K key, Float defaultValue) {
public Float getFloat(K key, Float defaultValue) {
final Object obj = getObj(key); final Object obj = getObj(key);
if(null == obj) { if(null == obj) {
return defaultValue; return defaultValue;
@ -77,8 +71,7 @@ public abstract class OptNullBasicTypeFromObjectGetter<K> extends OptNullBasicTy
return Convert.toFloat(obj, defaultValue); return Convert.toFloat(obj, defaultValue);
} }
@Override default Double getDouble(K key, Double defaultValue) {
public Double getDouble(K key, Double defaultValue) {
final Object obj = getObj(key); final Object obj = getObj(key);
if(null == obj) { if(null == obj) {
return defaultValue; return defaultValue;
@ -86,8 +79,7 @@ public abstract class OptNullBasicTypeFromObjectGetter<K> extends OptNullBasicTy
return Convert.toDouble(obj, defaultValue); return Convert.toDouble(obj, defaultValue);
} }
@Override default Byte getByte(K key, Byte defaultValue) {
public Byte getByte(K key, Byte defaultValue) {
final Object obj = getObj(key); final Object obj = getObj(key);
if(null == obj) { if(null == obj) {
return defaultValue; return defaultValue;
@ -95,8 +87,7 @@ public abstract class OptNullBasicTypeFromObjectGetter<K> extends OptNullBasicTy
return Convert.toByte(obj, defaultValue); return Convert.toByte(obj, defaultValue);
} }
@Override default BigDecimal getBigDecimal(K key, BigDecimal defaultValue) {
public BigDecimal getBigDecimal(K key, BigDecimal defaultValue) {
final Object obj = getObj(key); final Object obj = getObj(key);
if(null == obj) { if(null == obj) {
return defaultValue; return defaultValue;
@ -104,8 +95,7 @@ public abstract class OptNullBasicTypeFromObjectGetter<K> extends OptNullBasicTy
return Convert.toBigDecimal(obj, defaultValue); return Convert.toBigDecimal(obj, defaultValue);
} }
@Override default BigInteger getBigInteger(K key, BigInteger defaultValue) {
public BigInteger getBigInteger(K key, BigInteger defaultValue) {
final Object obj = getObj(key); final Object obj = getObj(key);
if(null == obj) { if(null == obj) {
return defaultValue; return defaultValue;
@ -113,8 +103,7 @@ public abstract class OptNullBasicTypeFromObjectGetter<K> extends OptNullBasicTy
return Convert.toBigInteger(obj, defaultValue); return Convert.toBigInteger(obj, defaultValue);
} }
@Override default <E extends Enum<E>> E getEnum(Class<E> clazz, K key, E defaultValue) {
public <E extends Enum<E>> E getEnum(Class<E> clazz, K key, E defaultValue) {
final Object obj = getObj(key); final Object obj = getObj(key);
if(null == obj) { if(null == obj) {
return defaultValue; return defaultValue;
@ -122,8 +111,7 @@ public abstract class OptNullBasicTypeFromObjectGetter<K> extends OptNullBasicTy
return Convert.toEnum(clazz, obj, defaultValue); return Convert.toEnum(clazz, obj, defaultValue);
} }
@Override default Date getDate(K key, Date defaultValue) {
public Date getDate(K key, Date defaultValue) {
final Object obj = getObj(key); final Object obj = getObj(key);
if(null == obj) { if(null == obj) {
return defaultValue; return defaultValue;

View File

@ -12,70 +12,57 @@ import cn.hutool.core.convert.Convert;
* *
* @author Looly * @author Looly
*/ */
public abstract class OptNullBasicTypeFromStringGetter<K> extends OptNullBasicTypeGetter<K> { public interface OptNullBasicTypeFromStringGetter<K> extends OptNullBasicTypeGetter<K> {
@Override default Object getObj(K key, Object defaultValue) {
public Object getObj(K key, Object defaultValue) {
return getStr(key, null == defaultValue ? null : defaultValue.toString()); return getStr(key, null == defaultValue ? null : defaultValue.toString());
} }
@Override default Integer getInt(K key, Integer defaultValue) {
public Integer getInt(K key, Integer defaultValue) {
return Convert.toInt(getStr(key), defaultValue); return Convert.toInt(getStr(key), defaultValue);
} }
@Override default Short getShort(K key, Short defaultValue) {
public Short getShort(K key, Short defaultValue) {
return Convert.toShort(getStr(key), defaultValue); return Convert.toShort(getStr(key), defaultValue);
} }
@Override default Boolean getBool(K key, Boolean defaultValue) {
public Boolean getBool(K key, Boolean defaultValue) {
return Convert.toBool(getStr(key), defaultValue); return Convert.toBool(getStr(key), defaultValue);
} }
@Override default Long getLong(K key, Long defaultValue) {
public Long getLong(K key, Long defaultValue) {
return Convert.toLong(getStr(key), defaultValue); return Convert.toLong(getStr(key), defaultValue);
} }
@Override default Character getChar(K key, Character defaultValue) {
public Character getChar(K key, Character defaultValue) {
return Convert.toChar(getStr(key), defaultValue); return Convert.toChar(getStr(key), defaultValue);
} }
@Override default Float getFloat(K key, Float defaultValue) {
public Float getFloat(K key, Float defaultValue) {
return Convert.toFloat(getStr(key), defaultValue); return Convert.toFloat(getStr(key), defaultValue);
} }
@Override default Double getDouble(K key, Double defaultValue) {
public Double getDouble(K key, Double defaultValue) {
return Convert.toDouble(getStr(key), defaultValue); return Convert.toDouble(getStr(key), defaultValue);
} }
@Override default Byte getByte(K key, Byte defaultValue) {
public Byte getByte(K key, Byte defaultValue) {
return Convert.toByte(getStr(key), defaultValue); return Convert.toByte(getStr(key), defaultValue);
} }
@Override default BigDecimal getBigDecimal(K key, BigDecimal defaultValue) {
public BigDecimal getBigDecimal(K key, BigDecimal defaultValue) {
return Convert.toBigDecimal(getStr(key), defaultValue); return Convert.toBigDecimal(getStr(key), defaultValue);
} }
@Override default BigInteger getBigInteger(K key, BigInteger defaultValue) {
public BigInteger getBigInteger(K key, BigInteger defaultValue) {
return Convert.toBigInteger(getStr(key), defaultValue); return Convert.toBigInteger(getStr(key), defaultValue);
} }
@Override default <E extends Enum<E>> E getEnum(Class<E> clazz, K key, E defaultValue) {
public <E extends Enum<E>> E getEnum(Class<E> clazz, K key, E defaultValue) {
return Convert.toEnum(clazz, getStr(key), defaultValue); return Convert.toEnum(clazz, getStr(key), defaultValue);
} }
@Override default Date getDate(K key, Date defaultValue) {
public Date getDate(K key, Date defaultValue) {
return Convert.toDate(getStr(key), defaultValue); return Convert.toDate(getStr(key), defaultValue);
} }
} }

View File

@ -8,13 +8,12 @@ import java.util.Date;
* 基本类型的getter接口抽象实现<br> * 基本类型的getter接口抽象实现<br>
* 提供一个统一的接口定义返回不同类型的值基本类型<br> * 提供一个统一的接口定义返回不同类型的值基本类型<br>
* 在不提供默认值的情况下 如果值不存在或获取错误返回null<br> * 在不提供默认值的情况下 如果值不存在或获取错误返回null<br>
* 用户只需实现{@code com.xiaoleilu.hutool.getter.OptBasicTypeGetter}接口即可 * 用户只需实现{@link OptBasicTypeGetter}接口即可
* @author Looly * @author Looly
*/ */
public abstract class OptNullBasicTypeGetter<K> implements BasicTypeGetter<K>, OptBasicTypeGetter<K>{ public interface OptNullBasicTypeGetter<K> extends BasicTypeGetter<K>, OptBasicTypeGetter<K>{
@Override default Object getObj(K key) {
public Object getObj(K key) {
return getObj(key, null); return getObj(key, null);
} }
@ -25,8 +24,7 @@ public abstract class OptNullBasicTypeGetter<K> implements BasicTypeGetter<K>, O
* @param key 属性名 * @param key 属性名
* @return 属性值 * @return 属性值
*/ */
@Override default String getStr(K key){
public String getStr(K key){
return this.getStr(key, null); return this.getStr(key, null);
} }
@ -37,8 +35,7 @@ public abstract class OptNullBasicTypeGetter<K> implements BasicTypeGetter<K>, O
* @param key 属性名 * @param key 属性名
* @return 属性值 * @return 属性值
*/ */
@Override default Integer getInt(K key) {
public Integer getInt(K key) {
return this.getInt(key, null); return this.getInt(key, null);
} }
@ -49,8 +46,7 @@ public abstract class OptNullBasicTypeGetter<K> implements BasicTypeGetter<K>, O
* @param key 属性名 * @param key 属性名
* @return 属性值 * @return 属性值
*/ */
@Override default Short getShort(K key){
public Short getShort(K key){
return this.getShort(key, null); return this.getShort(key, null);
} }
@ -61,8 +57,7 @@ public abstract class OptNullBasicTypeGetter<K> implements BasicTypeGetter<K>, O
* @param key 属性名 * @param key 属性名
* @return 属性值 * @return 属性值
*/ */
@Override default Boolean getBool(K key){
public Boolean getBool(K key){
return this.getBool(key, null); return this.getBool(key, null);
} }
@ -73,8 +68,7 @@ public abstract class OptNullBasicTypeGetter<K> implements BasicTypeGetter<K>, O
* @param key 属性名 * @param key 属性名
* @return 属性值 * @return 属性值
*/ */
@Override default Long getLong(K key){
public Long getLong(K key){
return this.getLong(key, null); return this.getLong(key, null);
} }
@ -85,8 +79,7 @@ public abstract class OptNullBasicTypeGetter<K> implements BasicTypeGetter<K>, O
* @param key 属性名 * @param key 属性名
* @return 属性值 * @return 属性值
*/ */
@Override default Character getChar(K key){
public Character getChar(K key){
return this.getChar(key, null); return this.getChar(key, null);
} }
@ -97,8 +90,7 @@ public abstract class OptNullBasicTypeGetter<K> implements BasicTypeGetter<K>, O
* @param key 属性名 * @param key 属性名
* @return 属性值 * @return 属性值
*/ */
@Override default Float getFloat(K key){
public Float getFloat(K key){
return this.getFloat(key, null); return this.getFloat(key, null);
} }
@ -109,8 +101,7 @@ public abstract class OptNullBasicTypeGetter<K> implements BasicTypeGetter<K>, O
* @param key 属性名 * @param key 属性名
* @return 属性值 * @return 属性值
*/ */
@Override default Double getDouble(K key){
public Double getDouble(K key){
return this.getDouble(key, null); return this.getDouble(key, null);
} }
@ -121,8 +112,7 @@ public abstract class OptNullBasicTypeGetter<K> implements BasicTypeGetter<K>, O
* @param key 属性名 * @param key 属性名
* @return 属性值 * @return 属性值
*/ */
@Override default Byte getByte(K key){
public Byte getByte(K key){
return this.getByte(key, null); return this.getByte(key, null);
} }
@ -133,8 +123,7 @@ public abstract class OptNullBasicTypeGetter<K> implements BasicTypeGetter<K>, O
* @param key 属性名 * @param key 属性名
* @return 属性值 * @return 属性值
*/ */
@Override default BigDecimal getBigDecimal(K key){
public BigDecimal getBigDecimal(K key){
return this.getBigDecimal(key, null); return this.getBigDecimal(key, null);
} }
@ -145,8 +134,7 @@ public abstract class OptNullBasicTypeGetter<K> implements BasicTypeGetter<K>, O
* @param key 属性名 * @param key 属性名
* @return 属性值 * @return 属性值
*/ */
@Override default BigInteger getBigInteger(K key){
public BigInteger getBigInteger(K key){
return this.getBigInteger(key, null); return this.getBigInteger(key, null);
} }
@ -158,8 +146,7 @@ public abstract class OptNullBasicTypeGetter<K> implements BasicTypeGetter<K>, O
* @param key 属性名 * @param key 属性名
* @return 属性值 * @return 属性值
*/ */
@Override default <E extends Enum<E>> E getEnum(Class<E> clazz, K key) {
public <E extends Enum<E>> E getEnum(Class<E> clazz, K key) {
return this.getEnum(clazz, key, null); return this.getEnum(clazz, key, null);
} }
@ -170,8 +157,7 @@ public abstract class OptNullBasicTypeGetter<K> implements BasicTypeGetter<K>, O
* @param key 属性名 * @param key 属性名
* @return 属性值 * @return 属性值
*/ */
@Override default Date getDate(K key) {
public Date getDate(K key) {
return this.getDate(key, null); return this.getDate(key, null);
} }
} }

View File

@ -53,7 +53,7 @@ public class Img implements Serializable {
/** /**
* 目标图片文件格式用于写出 * 目标图片文件格式用于写出
*/ */
private String targetImageType = ImgUtil.IMAGE_TYPE_JPG; private String targetImageType;
/** /**
* 计算x,y坐标的时候是否从中心做为原始坐标开始计算 * 计算x,y坐标的时候是否从中心做为原始坐标开始计算
*/ */
@ -140,7 +140,22 @@ public class Img implements Serializable {
* @param srcImage 来源图片 * @param srcImage 来源图片
*/ */
public Img(BufferedImage srcImage) { public Img(BufferedImage srcImage) {
this(srcImage, null);
}
/**
* 构造
*
* @param srcImage 来源图片
* @param targetImageType 目标图片类型
* @since 5.0.7
*/
public Img(BufferedImage srcImage, String targetImageType) {
this.srcImage = srcImage; this.srcImage = srcImage;
if(null == targetImageType){
targetImageType = ImgUtil.IMAGE_TYPE_JPG;
}
this.targetImageType = targetImageType;
} }
/** /**
@ -294,15 +309,14 @@ public class Img implements Serializable {
srcHeight = srcImage.getHeight(null); srcHeight = srcImage.getHeight(null);
srcWidth = srcImage.getWidth(null); srcWidth = srcImage.getWidth(null);
if (null == fixedColor) {// 补白
fixedColor = Color.WHITE;
}
final BufferedImage image = new BufferedImage(width, height, getTypeInt()); final BufferedImage image = new BufferedImage(width, height, getTypeInt());
Graphics2D g = image.createGraphics(); Graphics2D g = image.createGraphics();
// 设置背景 // 设置背景
if(null != fixedColor){
g.setBackground(fixedColor); g.setBackground(fixedColor);
g.clearRect(0, 0, width, height); g.clearRect(0, 0, width, height);
}
// 在中间贴图 // 在中间贴图
g.drawImage(srcImage, (width - srcWidth) / 2, (height - srcHeight) / 2, srcWidth, srcHeight, fixedColor, null); g.drawImage(srcImage, (width - srcWidth) / 2, (height - srcHeight) / 2, srcWidth, srcHeight, fixedColor, null);
@ -586,6 +600,7 @@ public class Img implements Serializable {
} }
if (targetFile.exists()) { if (targetFile.exists()) {
//noinspection ResultOfMethodCallIgnored
targetFile.delete(); targetFile.delete();
} }
@ -624,6 +639,7 @@ public class Img implements Serializable {
* @see BufferedImage#TYPE_INT_RGB * @see BufferedImage#TYPE_INT_RGB
*/ */
private int getTypeInt() { private int getTypeInt() {
//noinspection SwitchStatementWithTooFewBranches
switch (this.targetImageType) { switch (this.targetImageType) {
case ImgUtil.IMAGE_TYPE_PNG: case ImgUtil.IMAGE_TYPE_PNG:
return BufferedImage.TYPE_INT_ARGB; return BufferedImage.TYPE_INT_ARGB;
@ -678,6 +694,7 @@ public class Img implements Serializable {
if (degree >= 90) { if (degree >= 90) {
if (degree / 90 % 2 == 1) { if (degree / 90 % 2 == 1) {
int temp = height; int temp = height;
//noinspection SuspiciousNameCombination
height = width; height = width;
width = temp; width = temp;
} }

View File

@ -171,17 +171,20 @@ public class ImgUtil {
/** /**
* 缩放图像按高度和宽度缩放<br> * 缩放图像按高度和宽度缩放<br>
* 缩放后默认为jpeg格式 * 缩放后默认格式与源图片相同无法识别原图片默认JPG
* *
* @param srcImageFile 源图像文件地址 * @param srcImageFile 源图像文件地址
* @param destImageFile 缩放后的图像地址 * @param destImageFile 缩放后的图像地址
* @param width 缩放后的宽度 * @param width 缩放后的宽度
* @param height 缩放后的高度 * @param height 缩放后的高度
* @param fixedColor 比例不对时补充的颜色不补充为<code>null</code> * @param fixedColor 补充的颜色不补充为<code>null</code>
* @throws IORuntimeException IO异常 * @throws IORuntimeException IO异常
*/ */
public static void scale(File srcImageFile, File destImageFile, int width, int height, Color fixedColor) throws IORuntimeException { public static void scale(File srcImageFile, File destImageFile, int width, int height, Color fixedColor) throws IORuntimeException {
write(scale(read(srcImageFile), width, height, fixedColor), destImageFile); Img.from(srcImageFile)//
.setTargetImageType(FileUtil.extName(destImageFile))//
.scale(width, height, fixedColor)//
.write(destImageFile);
} }
/** /**
@ -397,12 +400,12 @@ public class ImgUtil {
if (srcWidth % destWidth == 0) { if (srcWidth % destWidth == 0) {
cols = srcWidth / destWidth; cols = srcWidth / destWidth;
} else { } else {
cols = (int) Math.floor(srcWidth / destWidth) + 1; cols = (int) Math.floor((double)srcWidth / destWidth) + 1;
} }
if (srcHeight % destHeight == 0) { if (srcHeight % destHeight == 0) {
rows = srcHeight / destHeight; rows = srcHeight / destHeight;
} else { } else {
rows = (int) Math.floor(srcHeight / destHeight) + 1; rows = (int) Math.floor((double)srcHeight / destHeight) + 1;
} }
// 循环建立切片 // 循环建立切片
Image tag; Image tag;

View File

@ -60,7 +60,7 @@ public class CamelCaseLinkedMap<K, V> extends CamelCaseMap<K, V> {
* @param loadFactor 加载因子 * @param loadFactor 加载因子
*/ */
public CamelCaseLinkedMap(int initialCapacity, float loadFactor) { public CamelCaseLinkedMap(int initialCapacity, float loadFactor) {
super(new HashMap<K, V>(initialCapacity, loadFactor)); super(new HashMap<>(initialCapacity, loadFactor));
} }
// ------------------------------------------------------------------------- Constructor end // ------------------------------------------------------------------------- Constructor end
} }

View File

@ -62,7 +62,7 @@ public class CamelCaseMap<K, V> extends CustomKeyMap<K, V> {
* @param loadFactor 加载因子 * @param loadFactor 加载因子
*/ */
public CamelCaseMap(int initialCapacity, float loadFactor) { public CamelCaseMap(int initialCapacity, float loadFactor) {
super(new HashMap<K, V>(initialCapacity, loadFactor)); super(new HashMap<>(initialCapacity, loadFactor));
} }
// ------------------------------------------------------------------------- Constructor end // ------------------------------------------------------------------------- Constructor end
@ -74,7 +74,7 @@ public class CamelCaseMap<K, V> extends CustomKeyMap<K, V> {
*/ */
@Override @Override
protected Object customKey(Object key) { protected Object customKey(Object key) {
if (null != key && key instanceof CharSequence) { if (key instanceof CharSequence) {
key = StrUtil.toCamelCase(key.toString()); key = StrUtil.toCamelCase(key.toString());
} }
return key; return key;

View File

@ -61,7 +61,7 @@ public class CaseInsensitiveLinkedMap<K, V> extends CaseInsensitiveMap<K, V> {
* @param loadFactor 加载因子 * @param loadFactor 加载因子
*/ */
public CaseInsensitiveLinkedMap(int initialCapacity, float loadFactor) { public CaseInsensitiveLinkedMap(int initialCapacity, float loadFactor) {
super(new LinkedHashMap<K, V>(initialCapacity, loadFactor)); super(new LinkedHashMap<>(initialCapacity, loadFactor));
} }
// ------------------------------------------------------------------------- Constructor end // ------------------------------------------------------------------------- Constructor end
} }

View File

@ -21,7 +21,7 @@ import cn.hutool.core.util.StrUtil;
* @author looly * @author looly
* @since 3.2.0 * @since 3.2.0
*/ */
public class MapProxy extends OptNullBasicTypeFromObjectGetter<Object> implements Map<Object, Object>, InvocationHandler, Serializable { public class MapProxy implements Map<Object, Object>, OptNullBasicTypeFromObjectGetter<Object>, InvocationHandler, Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
@ -89,7 +89,7 @@ public class MapProxy extends OptNullBasicTypeFromObjectGetter<Object> implement
return map.remove(key); return map.remove(key);
} }
@SuppressWarnings("unchecked") @SuppressWarnings({"unchecked", "NullableProblems"})
@Override @Override
public void putAll(Map<?, ?> m) { public void putAll(Map<?, ?> m) {
map.putAll(m); map.putAll(m);
@ -100,19 +100,19 @@ public class MapProxy extends OptNullBasicTypeFromObjectGetter<Object> implement
map.clear(); map.clear();
} }
@SuppressWarnings("unchecked") @SuppressWarnings({"unchecked", "NullableProblems"})
@Override @Override
public Set<Object> keySet() { public Set<Object> keySet() {
return map.keySet(); return map.keySet();
} }
@SuppressWarnings("unchecked") @SuppressWarnings({"unchecked", "NullableProblems"})
@Override @Override
public Collection<Object> values() { public Collection<Object> values() {
return map.values(); return map.values();
} }
@SuppressWarnings("unchecked") @SuppressWarnings({"unchecked", "NullableProblems"})
@Override @Override
public Set<Entry<Object, Object>> entrySet() { public Set<Entry<Object, Object>> entrySet() {
return map.entrySet(); return map.entrySet();

View File

@ -79,6 +79,7 @@ public class MapWrapper<K, V> implements Map<K, V>, Iterable<Map.Entry<K, V>>, S
} }
@Override @Override
@SuppressWarnings("NullableProblems")
public void putAll(Map<? extends K, ? extends V> m) { public void putAll(Map<? extends K, ? extends V> m) {
raw.putAll(m); raw.putAll(m);
} }
@ -89,23 +90,31 @@ public class MapWrapper<K, V> implements Map<K, V>, Iterable<Map.Entry<K, V>>, S
} }
@Override @Override
public Set<K> keySet() { @SuppressWarnings("NullableProblems")
return raw.keySet();
}
@Override
public Collection<V> values() { public Collection<V> values() {
return raw.values(); return raw.values();
} }
@Override @Override
@SuppressWarnings("NullableProblems")
public Set<K> keySet() {
return raw.keySet();
}
@Override
@SuppressWarnings("NullableProblems")
public Set<Entry<K, V>> entrySet() { public Set<Entry<K, V>> entrySet() {
return raw.entrySet(); return raw.entrySet();
} }
@Override @Override
@SuppressWarnings("NullableProblems")
public Iterator<Entry<K, V>> iterator() { public Iterator<Entry<K, V>> iterator() {
return this.entrySet().iterator(); return this.entrySet().iterator();
} }
@Override
public String toString() {
return raw.toString();
}
} }

View File

@ -33,6 +33,7 @@ import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory; import javax.xml.xpath.XPathFactory;
import cn.hutool.core.collection.CollUtil;
import org.w3c.dom.Document; import org.w3c.dom.Document;
import org.w3c.dom.Element; import org.w3c.dom.Element;
import org.w3c.dom.Node; import org.w3c.dom.Node;
@ -756,9 +757,14 @@ public class XmlUtil {
childNode = nodeList.item(i); childNode = nodeList.item(i);
if (isElement(childNode)) { if (isElement(childNode)) {
childEle = (Element) childNode; childEle = (Element) childNode;
final Object value = result.get(childEle.getNodeName());
if(null != value){
result.put(childEle.getNodeName(), CollUtil.newArrayList(value, childEle.getTextContent()));
} else{
result.put(childEle.getNodeName(), childEle.getTextContent()); result.put(childEle.getNodeName(), childEle.getTextContent());
} }
} }
}
return result; return result;
} }

View File

@ -1,17 +1,16 @@
package cn.hutool.core.util; package cn.hutool.core.util;
import java.util.LinkedHashMap; import cn.hutool.core.collection.CollUtil;
import java.util.Map; import cn.hutool.core.map.MapBuilder;
import cn.hutool.core.map.MapUtil;
import javax.xml.xpath.XPathConstants;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Ignore; import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import org.w3c.dom.Document; import org.w3c.dom.Document;
import cn.hutool.core.map.MapBuilder; import javax.xml.xpath.XPathConstants;
import cn.hutool.core.map.MapUtil; import java.util.LinkedHashMap;
import java.util.Map;
/** /**
* {@link XmlUtil} 工具类 * {@link XmlUtil} 工具类
@ -86,6 +85,15 @@ public class XmlUtilTest {
Assert.assertEquals("1", map.get("successCounts")); Assert.assertEquals("1", map.get("successCounts"));
} }
@Test
public void xmlToMapTest2() {
String xml = "<root><name>张三</name><name>李四</name></root>";
Map<String, Object> map = XmlUtil.xmlToMap(xml);
Assert.assertEquals(1, map.size());
Assert.assertEquals(CollUtil.newArrayList("张三", "李四"), map.get("name"));
}
@Test @Test
public void mapToXmlTest() { public void mapToXmlTest() {
Map<String, Object> map = MapBuilder.create(new LinkedHashMap<String, Object>())// Map<String, Object> map = MapBuilder.create(new LinkedHashMap<String, Object>())//

View File

@ -19,6 +19,8 @@ import java.util.List;
import java.util.ListIterator; import java.util.ListIterator;
import java.util.RandomAccess; import java.util.RandomAccess;
import static cn.hutool.json.JSONConverter.*;
/** /**
* JSON数组<br> * JSON数组<br>
* JSON数组是表示中括号括住的数据表现形式<br> * JSON数组是表示中括号括住的数据表现形式<br>
@ -30,7 +32,7 @@ import java.util.RandomAccess;
* *
* @author looly * @author looly
*/ */
public class JSONArray extends JSONGetter<Integer> implements JSON, List<Object>, RandomAccess { public class JSONArray implements JSON, JSONGetter<Integer>, List<Object>, RandomAccess {
private static final long serialVersionUID = 2664900568717612292L; private static final long serialVersionUID = 2664900568717612292L;
/** 默认初始大小 */ /** 默认初始大小 */
@ -236,7 +238,7 @@ public class JSONArray extends JSONGetter<Integer> implements JSON, List<Object>
@Override @Override
public <T> T getByPath(String expression, Class<T> resultType) { public <T> T getByPath(String expression, Class<T> resultType) {
return JSONConverter.jsonConvert(resultType, getByPath(expression), true); return jsonConvert(resultType, getByPath(expression), true);
} }
@Override @Override
@ -314,6 +316,7 @@ public class JSONArray extends JSONGetter<Integer> implements JSON, List<Object>
} }
} }
@SuppressWarnings("NullableProblems")
@Override @Override
public Iterator<Object> iterator() { public Iterator<Object> iterator() {
return rawList.iterator(); return rawList.iterator();
@ -344,13 +347,14 @@ public class JSONArray extends JSONGetter<Integer> implements JSON, List<Object>
return rawList.contains(o); return rawList.contains(o);
} }
@SuppressWarnings("NullableProblems")
@Override @Override
public Object[] toArray() { public Object[] toArray() {
return rawList.toArray(); return rawList.toArray();
} }
@Override @Override
@SuppressWarnings("unchecked") @SuppressWarnings({"unchecked", "NullableProblems"})
public <T> T[] toArray(T[] a) { public <T> T[] toArray(T[] a) {
return (T[]) JSONConverter.toArray(this, a.getClass().getComponentType()); return (T[]) JSONConverter.toArray(this, a.getClass().getComponentType());
} }
@ -370,11 +374,13 @@ public class JSONArray extends JSONGetter<Integer> implements JSON, List<Object>
return rawList.remove(o); return rawList.remove(o);
} }
@SuppressWarnings("NullableProblems")
@Override @Override
public boolean containsAll(Collection<?> c) { public boolean containsAll(Collection<?> c) {
return rawList.containsAll(c); return rawList.containsAll(c);
} }
@SuppressWarnings("NullableProblems")
@Override @Override
public boolean addAll(Collection<?> c) { public boolean addAll(Collection<?> c) {
if (CollUtil.isEmpty(c)) { if (CollUtil.isEmpty(c)) {
@ -386,6 +392,7 @@ public class JSONArray extends JSONGetter<Integer> implements JSON, List<Object>
return true; return true;
} }
@SuppressWarnings("NullableProblems")
@Override @Override
public boolean addAll(int index, Collection<?> c) { public boolean addAll(int index, Collection<?> c) {
if (CollUtil.isEmpty(c)) { if (CollUtil.isEmpty(c)) {
@ -398,11 +405,13 @@ public class JSONArray extends JSONGetter<Integer> implements JSON, List<Object>
return rawList.addAll(index, list); return rawList.addAll(index, list);
} }
@SuppressWarnings("NullableProblems")
@Override @Override
public boolean removeAll(Collection<?> c) { public boolean removeAll(Collection<?> c) {
return this.rawList.removeAll(c); return this.rawList.removeAll(c);
} }
@SuppressWarnings("NullableProblems")
@Override @Override
public boolean retainAll(Collection<?> c) { public boolean retainAll(Collection<?> c) {
return this.rawList.retainAll(c); return this.rawList.retainAll(c);
@ -446,16 +455,19 @@ public class JSONArray extends JSONGetter<Integer> implements JSON, List<Object>
return this.rawList.lastIndexOf(o); return this.rawList.lastIndexOf(o);
} }
@SuppressWarnings("NullableProblems")
@Override @Override
public ListIterator<Object> listIterator() { public ListIterator<Object> listIterator() {
return this.rawList.listIterator(); return this.rawList.listIterator();
} }
@SuppressWarnings("NullableProblems")
@Override @Override
public ListIterator<Object> listIterator(int index) { public ListIterator<Object> listIterator(int index) {
return this.rawList.listIterator(index); return this.rawList.listIterator(index);
} }
@SuppressWarnings("NullableProblems")
@Override @Override
public List<Object> subList(int fromIndex, int toIndex) { public List<Object> subList(int fromIndex, int toIndex) {
return this.rawList.subList(fromIndex, toIndex); return this.rawList.subList(fromIndex, toIndex);

View File

@ -9,7 +9,7 @@ import cn.hutool.core.getter.OptNullBasicTypeFromObjectGetter;
* *
* @param <K> Key类型 * @param <K> Key类型
*/ */
public abstract class JSONGetter<K> extends OptNullBasicTypeFromObjectGetter<K>{ public interface JSONGetter<K> extends OptNullBasicTypeFromObjectGetter<K>{
/** /**
* key对应值是否为<code>null</code>或无此key * key对应值是否为<code>null</code>或无此key
@ -17,7 +17,7 @@ public abstract class JSONGetter<K> extends OptNullBasicTypeFromObjectGetter<K>{
* @param key * @param key
* @return true 无此key或值为<code>null</code>{@link JSONNull#NULL}返回<code>false</code>其它返回<code>true</code> * @return true 无此key或值为<code>null</code>{@link JSONNull#NULL}返回<code>false</code>其它返回<code>true</code>
*/ */
public boolean isNull(K key) { default boolean isNull(K key) {
return JSONNull.NULL.equals(this.getObj(key)); return JSONNull.NULL.equals(this.getObj(key));
} }
@ -28,7 +28,7 @@ public abstract class JSONGetter<K> extends OptNullBasicTypeFromObjectGetter<K>{
* @return 字符串类型值 * @return 字符串类型值
* @since 4.2.2 * @since 4.2.2
*/ */
public String getStrEscaped(K key) { default String getStrEscaped(K key) {
return getStrEscaped(key, null); return getStrEscaped(key, null);
} }
@ -40,7 +40,7 @@ public abstract class JSONGetter<K> extends OptNullBasicTypeFromObjectGetter<K>{
* @return 字符串类型值 * @return 字符串类型值
* @since 4.2.2 * @since 4.2.2
*/ */
public String getStrEscaped(K key, String defaultValue) { default String getStrEscaped(K key, String defaultValue) {
return JSONUtil.escape(getStr(key, defaultValue)); return JSONUtil.escape(getStr(key, defaultValue));
} }
@ -51,7 +51,7 @@ public abstract class JSONGetter<K> extends OptNullBasicTypeFromObjectGetter<K>{
* @param key KEY * @param key KEY
* @return JSONArray对象如果值为null或者非JSONArray类型返回null * @return JSONArray对象如果值为null或者非JSONArray类型返回null
*/ */
public JSONArray getJSONArray(K key) { default JSONArray getJSONArray(K key) {
final Object object = this.getObj(key); final Object object = this.getObj(key);
if(null == object) { if(null == object) {
return null; return null;
@ -70,7 +70,7 @@ public abstract class JSONGetter<K> extends OptNullBasicTypeFromObjectGetter<K>{
* @param key KEY * @param key KEY
* @return JSONArray对象如果值为null或者非JSONObject类型返回null * @return JSONArray对象如果值为null或者非JSONObject类型返回null
*/ */
public JSONObject getJSONObject(K key) { default JSONObject getJSONObject(K key) {
final Object object = this.getObj(key); final Object object = this.getObj(key);
if(null == object) { if(null == object) {
return null; return null;
@ -92,7 +92,7 @@ public abstract class JSONGetter<K> extends OptNullBasicTypeFromObjectGetter<K>{
* @return Bean对象如果值为null或者非JSONObject类型返回null * @return Bean对象如果值为null或者非JSONObject类型返回null
* @since 3.1.1 * @since 3.1.1
*/ */
public <T> T getBean(K key, Class<T> beanType) { default <T> T getBean(K key, Class<T> beanType) {
final JSONObject obj = getJSONObject(key); final JSONObject obj = getJSONObject(key);
return (null == obj) ? null : obj.toBean(beanType); return (null == obj) ? null : obj.toBean(beanType);
} }
@ -108,7 +108,7 @@ public abstract class JSONGetter<K> extends OptNullBasicTypeFromObjectGetter<K>{
* @throws ConvertException 转换异常 * @throws ConvertException 转换异常
* @since 3.0.8 * @since 3.0.8
*/ */
public <T> T get(K key, Class<T> type) throws ConvertException{ default <T> T get(K key, Class<T> type) throws ConvertException{
return get(key, type, false); return get(key, type, false);
} }
@ -123,7 +123,7 @@ public abstract class JSONGetter<K> extends OptNullBasicTypeFromObjectGetter<K>{
* @throws ConvertException 转换异常 * @throws ConvertException 转换异常
* @since 3.0.8 * @since 3.0.8
*/ */
public <T> T get(K key, Class<T> type, boolean ignoreError) throws ConvertException{ default <T> T get(K key, Class<T> type, boolean ignoreError) throws ConvertException{
final Object value = this.getObj(key); final Object value = this.getObj(key);
if(null == value){ if(null == value){
return null; return null;

View File

@ -37,7 +37,7 @@ import java.util.Set;
* *
* @author looly * @author looly
*/ */
public class JSONObject extends JSONGetter<String> implements JSON, Map<String, Object> { public class JSONObject implements JSON, JSONGetter<String>, Map<String, Object> {
private static final long serialVersionUID = -330220388580734346L; private static final long serialVersionUID = -330220388580734346L;
/** 默认初始大小 */ /** 默认初始大小 */
@ -163,7 +163,7 @@ public class JSONObject extends JSONGetter<String> implements JSON, Map<String,
*/ */
public JSONObject(Object source, boolean ignoreNullValue, boolean isOrder) { public JSONObject(Object source, boolean ignoreNullValue, boolean isOrder) {
this(source, JSONConfig.create().setOrder(isOrder)// this(source, JSONConfig.create().setOrder(isOrder)//
.setIgnoreCase((source instanceof CaseInsensitiveMap) || (source instanceof CaseInsensitiveLinkedMap))// .setIgnoreCase((source instanceof CaseInsensitiveMap))//
.setIgnoreNullValue(ignoreNullValue)); .setIgnoreNullValue(ignoreNullValue));
} }
@ -478,16 +478,19 @@ public class JSONObject extends JSONGetter<String> implements JSON, Map<String,
rawHashMap.clear(); rawHashMap.clear();
} }
@SuppressWarnings("NullableProblems")
@Override @Override
public Set<String> keySet() { public Set<String> keySet() {
return this.rawHashMap.keySet(); return this.rawHashMap.keySet();
} }
@SuppressWarnings("NullableProblems")
@Override @Override
public Collection<Object> values() { public Collection<Object> values() {
return rawHashMap.values(); return rawHashMap.values();
} }
@SuppressWarnings("NullableProblems")
@Override @Override
public Set<Entry<String, Object>> entrySet() { public Set<Entry<String, Object>> entrySet() {
return rawHashMap.entrySet(); return rawHashMap.entrySet();
@ -643,7 +646,7 @@ public class JSONObject extends JSONGetter<String> implements JSON, Map<String,
* *
* @param source JavaBean或者Map对象或者String * @param source JavaBean或者Map对象或者String
*/ */
@SuppressWarnings({ "rawtypes", "unchecked" }) @SuppressWarnings({"rawtypes", "unchecked", "StatementWithEmptyBody"})
private void init(Object source) { private void init(Object source) {
if (null == source) { if (null == source) {
return; return;

View File

@ -18,7 +18,7 @@ import cn.hutool.log.LogFactory;
* *
* @author Looly * @author Looly
*/ */
public abstract class AbsSetting extends OptNullBasicTypeFromStringGetter<String> implements Serializable { public abstract class AbsSetting implements OptNullBasicTypeFromStringGetter<String>, Serializable {
private static final long serialVersionUID = 6200156302595905863L; private static final long serialVersionUID = 6200156302595905863L;
private final static Log log = LogFactory.get(); private final static Log log = LogFactory.get();