Java里判断值是否为Null并赋值给其他对象的扩展方法
Updated:
Contents
Java里判断值是否为Null并赋值给其他对象的扩展方法
前言
项目里,经常需要判断一个对象的值是否为空,然后再判断某个属性是否为空,然后将值赋值给其他对象的属性;
代码类似:
if(user.getName() != null){
user2.setName(user.getName());
}
if(user.getId() != null){
user2.setId(user.getId());
}
或者:
if(user != null){
if(user.getName() != null){
user2.setName(user.getName());
}
}
每次都需要写一堆空值判断,太麻烦;所以通过扩展方法来简化。
开始
扩展方法
为对象增加属性空值判断,并赋值给其他对象的扩展方法:
public class Extensions { public static <T> void setIfNotNull(final T value, Consumer<T> setter) { if (value != null) { setter.accept(value); } } }
使用方式:
User user1 = new User(); User user2 = new User(); //use static method: setIfNotNull(user1.getId(), user2::setId);
以上代码等价于:
if(user1.getId() != null){ user2.setId(user1.getId()); }
判断对象是否为空,并判断属性是否为空,如果不为空,赋值给其他对象:
//check whether user1 is null: Optional.of(user1) .ifPresent(u -> setIfNotNull(u.getId(), user2::setId));
以上代码等价于:
if(user1 != null && user1.getId() != null){ user2.setId(user1.getId()); }
类型转换
- 将Double类型的值转换为Long类型的扩展方法:
其他类型转换同上;public static void setIfNotNull(final Double value, Consumer<Long> setter) { if (value != null) { setter.accept(value.longValue()); } }
枚举类(enum)的扩展方法
枚举类型不太一样,需要让枚举类实现IEnum接口:
public interface IEnum { Integer getValue(); String getName(); }
自定义枚举类型:
import lombok.Getter; public enum MyEnum implements IEnum { FIRST(1, "first"), SECOND(2, "second"), ; @Getter private Integer value; @Getter private String name; MyEnum(Integer value, String name) { this.value = value; this.name = name; } }
扩展方法:
public static void setEnumValue(final IEnum enumObj, Consumer<Integer> setter) { if (enumObj != null) { setter.accept(enumObj.getValue()); } } public static void setEnumName(final IEnum enumObj, Consumer<String> setter) { if (enumObj != null) { setter.accept(enumObj.getName()); } }
使用方式:
User user1 = new User(); User user2 = new User(); MyEnum myEnum = MyEnum.FIRST; setEnumValue(myEnum, user2::setMyEnumValue); setEnumName(myEnum, user2::setMyEnumName);
如果值为空,设置默认值
反过来,如果属性的值不为空,则设置值;
如果值为空,则设置默认值;
扩展方法:
public static <T> void setDefault(T value, final T defaultValue, Consumer<T> setter) { if (value == null) { setter.accept(defaultValue); } else { setter.accept(value); } }
使用方式:
User user1 = new User(); User user2 = new User(); user2.setDefault(user1.getId(), 2, user2::setId);
示例代码
以上示例代码:
GitHub/java_null_extensions