Java Concat POJO的所有非空属性

Java Concat POJO的所有非空属性,java,if-statement,pojo,code-cleanup,Java,If Statement,Pojo,Code Cleanup,我有一个POJO,它有10-15个字段(可以是原语、自定义对象或字符串)。 我想将所有非null字段合并为一个字符串 有没有干净的方法不用使用10-15if语句如果那只是一个字符串,那么你可以连接然后用空空格替换null这个词,但是要注意用于附加字段的附加字符(你不想看到像john,,,22,,,true这样的东西) 检查这个例子 class Ideone { public static void main (String[] args) throws java.lang.Excepti

我有一个
POJO
,它有10-15个字段(可以是原语、自定义对象或字符串)。 我想将所有
非null
字段合并为一个字符串


有没有干净的方法不用使用10-15
if语句

如果那只是一个字符串,那么你可以连接然后用空空格替换null这个词,但是要注意用于附加字段的附加字符(你不想看到像john,,,22,,,true这样的东西)

检查这个例子

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岁


您可以使用反射:

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。

默认情况下,您可以将所有字符串设置为

class-SomeObject{
私有字符串field1=“”;
私有字符串field2=“”;
//构造函数、getter和setter
@凌驾
公共字符串toString(){
返回字段1+field2;
}
}
或者在构造函数中执行此操作:

class-SomeObject{
私有字符串字段1;
私有字符串字段2;
公共SomeObject(字符串string1、字符串string2){
this.field1=string1==null?“:string1;
this.field2=string2==null?“:string2;
}
//接球手和接球手
@凌驾
公共字符串toString(){
返回字段1+field2;
}
}
或者,您可以修改getter以在字符串为null时返回
,并在concat方法中使用getter而不是直接调用var

class-SomeObject{
私有字符串字段1;
私有字符串字段2;
//构造函数和设置器
公共字符串getField1(){
返回字段1==null?“:字段1;
}
公共字符串getField2(){
返回字段2==null?“:字段2;
}
@凌驾
公共字符串toString(){
返回getField1()+getField2();
}
}

您能解释一下使用串联字符串的用例吗?或者您可以使用JacksonCleaver方法来完成此任务:)使用Java8流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){//使用反射处理此返回null;}}},而不是重写toString方法并实现类的StringBuilder。