Contents
  1. 1. Java里判断值是否为Null并赋值给其他对象的扩展方法
    1. 1.1. 前言
    2. 1.2. 开始
      1. 1.2.1. 扩展方法
      2. 1.2.2. 类型转换
      3. 1.2.3. 枚举类(enum)的扩展方法
      4. 1.2.4. 如果值为空,设置默认值
    3. 1.3. 示例代码
    4. 1.4. 参考链接

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

每次都需要写一堆空值判断,太麻烦;所以通过扩展方法来简化。

开始

扩展方法
  1. 为对象增加属性空值判断,并赋值给其他对象的扩展方法:

     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());
    }
    
  2. 判断对象是否为空,并判断属性是否为空,如果不为空,赋值给其他对象:

     //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());
    }
    
类型转换
  1. 将Double类型的值转换为Long类型的扩展方法:
     public static void setIfNotNull(final Double value, Consumer<Long> setter) {
       if (value != null) {
           setter.accept(value.longValue());
       }
    }
    
    其他类型转换同上;
枚举类(enum)的扩展方法
  1. 枚举类型不太一样,需要让枚举类实现IEnum接口:

    public interface IEnum {
     Integer getValue();
     String getName();
    }
    
  2. 自定义枚举类型:

    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;
       }
    }
    
  3. 扩展方法:

     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);
    
如果值为空,设置默认值

反过来,如果属性的值不为空,则设置值;
如果值为空,则设置默认值;

  1. 扩展方法:

     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

参考链接

Contents
  1. 1. Java里判断值是否为Null并赋值给其他对象的扩展方法
    1. 1.1. 前言
    2. 1.2. 开始
      1. 1.2.1. 扩展方法
      2. 1.2.2. 类型转换
      3. 1.2.3. 枚举类(enum)的扩展方法
      4. 1.2.4. 如果值为空,设置默认值
    3. 1.3. 示例代码
    4. 1.4. 参考链接