【问题标题】:Concat all nonNull properties of a POJO连接 POJO 的所有非 Null 属性
【发布时间】:2020-06-17 11:08:11
【问题描述】:

我有一个POJO,它有 10-15 个字段(可以是原始的、自定义对象或字符串)。 我想将所有NonNull 字段连接到一个字符串中。

不使用 10-15 if statements 有什么干净的方法吗?

【问题讨论】:

  • 你能解释一下你将使用连接字符串的用例吗?或者你可以使用杰克逊

标签: java if-statement pojo code-cleanup


【解决方案1】:

你可以使用反射:

Foo foo = new Foo(3, 89, null);

Field[] fields = foo.getClass().getDeclaredFields();

for(Field field: fields) {
    Object fieldValue = field.get(foo);
    if(fieldValue != null) {
        // Do your actual logic here
        System.out.println(fieldValue);
    }
}

使用这样的 Foo 类:

    static class Foo {
        int bar;
        int barre;
        String barString;

        public Foo(int bar, int barre, String barString) {
            this.bar = bar;
            this.barre = barre;
            this.barString = barString;
        }
    }

注意:这是假设您可以访问 Foo 中的字段,如果它们是私有的,那么您必须使用 getter。

【讨论】:

  • 切割刀的方式来完成这个:)
  • 使用 Java 8 Stream API,您可以简化为 Stream.of(Foo.class.getDeclaredFields()) .map(this::getFieldValue) .filter(o -> o!=null) .map(o -> o.toString()) .collect(Collectors.joining());私有对象 getFieldValue(Field field) { try { return field.get(this); } catch (IllegalAccessException e) { // 处理这个 return null; } }
  • 使用反射,而不是重写toString方法并为类实现StringBuilder。
【解决方案2】:

如果这只是一个字符串,那么您可以连接然后将单词 null 替换为空格,但要小心用于附加字段的附加字符(您不想看到像 john,,,22,, ,真的)

检查这个例子

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        // your code goes here
        String x = null;
        String a="Hello";
        Long l1=null;
        Long l2=55L;

        String r=a+x+l1+l2;
        r=r.replace("null", "-");
        System.out.println(r);
    }
}

这将打印出来

你好--55

【讨论】:

    【解决方案3】:

    您可以将所有字符串默认设置为""

    class SomeObject {
        private String field1 = "";
        private String field2 = "";
    
        //constructor, getters and setters
    
        @Override
        public String toString() {
            return field1 + field2;
        }
    }
    

    或者在构造函数中做:

    class SomeObject {
        private String field1;
        private String field2;
    
        public SomeObject(String string1, String string2) {
            this.field1 = string1 == null ? "" : string1;
            this.field2 = string2 == null ? "" : string2;
        }
    
        //getters and setters
    
        @Override
        public String toString() {
            return field1 + field2;
        }
    }
    

    或者,您可以修改 getter 以在 String 为 null 时返回 "",并在 concat 方法中使用 getter 而不是直接调用 var。

    class SomeObject {
        private String field1;
        private String field2;
    
        // constructor and setters
    
        public String getField1() {
            return field1 == null ? "" : field1;
        }
    
        public String getField2() {
            return field2 == null ? "" : field2;
        }
    
        @Override
        public String toString() {
            return getField1() + getField2();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      • 2021-06-30
      • 2016-11-10
      • 1970-01-01
      • 1970-01-01
      • 2021-05-12
      相关资源
      最近更新 更多