在Java中迭代列表并删除对象的内容

在Java中迭代列表并删除对象的内容,java,arraylist,reflection,Java,Arraylist,Reflection,我有一个名为deleteFields的数组列表。 我有一个名为mergedDiffSRO的对象。 我必须删除mergedDiffSRO中存在于deleteFields中的所有字段 LeadDetailsSRO mergedDiffSRO = new LeadDetailsSRO(); public class LeadDetailsSRO{ private String emailId; private String emailByC

我有一个名为deleteFields的数组列表。 我有一个名为mergedDiffSRO的对象。 我必须删除mergedDiffSRO中存在于deleteFields中的所有字段

LeadDetailsSRO mergedDiffSRO = new LeadDetailsSRO();

    public class LeadDetailsSRO{
        private String      emailId;
        private String      emailByCompany;
        private int         level;
        private LeadObjects leadobj;
        private String      alternateNumber;
        private String      languagePreference;
        private String      kycName;
        private String      businessAs;
        private String      aadharName;
        private String      panName;
        private String      ovdName;
        private String      kycStatus;
        private String      aadhaarStatus;
        private String      panStatus;
        private Set<String> ownershipTypeSet;
        private String      empId;
        private String      designation;
        private Boolean     nameMatchSuccess = null;
        private String      isSIMandatory;
    }


    List<String> deleteFields = new ArrayList<String>();
    deleteFields.add("businessAs");
    deleteFields.add("empId");
    deleteFields.add("designation");
    deleteFields.add("emailByCompany");
    deleteFields.add("level");
    deleteFields.add("ovdName");
leaddailssro mergedDiffSRO=新的leaddailssro();
公共类LeadDetailsRo{
私有字符串emailId;
私人公司;
私有整数级;
私人LeadObjects leadobj;
私有字符串交替枚举器;
私有字符串语言偏好;
私有字符串kycName;
私营企业;
私有字符串aadharName;
私有字符串名称;
私有字符串ovdName;
私有字符串kycStatus;
私有字符串aadhaarStatus;
私有字符串泛状态;
私有集所有者类型集;
私有字符串empId;
专用字符串指定;
私有布尔名称匹配成功=null;
私人字符串是强制性的;
}
List deleteFields=new ArrayList();
删除字段。添加(“业务”);
删除字段。添加(“empId”);
删除字段。添加(“名称”);
删除字段。添加(“emailByCompany”);
删除字段。添加(“级别”);
删除字段。添加(“ovdName”);
我如何进行同样的工作? 反射是否也同样适用?
请在JAVA

中使用适当的代码提出一些解决方法,您可以通过反射来实现。但这是丑陋、缓慢和容易出错的。这就是:

LeadDetailsSRO mergedDiffSRO = new LeadDetailsSRO();

    public class LeadDetailsSRO{
        private String      emailId;
        private String      emailByCompany;
        private int         level;
        private LeadObjects leadobj;
        private String      alternateNumber;
        private String      languagePreference;
        private String      kycName;
        private String      businessAs;
        private String      aadharName;
        private String      panName;
        private String      ovdName;
        private String      kycStatus;
        private String      aadhaarStatus;
        private String      panStatus;
        private Set<String> ownershipTypeSet;
        private String      empId;
        private String      designation;
        private Boolean     nameMatchSuccess = null;
        private String      isSIMandatory;
    }


    List<String> deleteFields = new ArrayList<String>();
    deleteFields.add("businessAs");
    deleteFields.add("empId");
    deleteFields.add("designation");
    deleteFields.add("emailByCompany");
    deleteFields.add("level");
    deleteFields.add("ovdName");
public void deleteFieldsByName(LeadDetailsSRO details, List<String> fieldNames) throws Exception {
    for (String fieldName : fieldNames) {
        Field field = LeadDetailsSRO.class.getDeclaredField(fieldName);

        // this is usually not allowed at production settings
        field.setAccessible(true);


        Class fieldType = field.getType();

        // the following if-else is ugly.
        // But that's what we can do. We have to differentiate by classes.
        if (fieldType.equals(String.class)) {
            field.set(details, null);
        } else if (fieldType.equals(Set.class)) {
            field.set(details, new HashSet<>());
        } else if (fieldType.toString().equals("int")) {
            field.set(details, 0);
        }
    }
public void deleteFieldsByName(LeadDetailsRo details,List FieldName)引发异常{
for(字符串字段名:字段名){
Field Field=LeadDetailsRo.class.getDeclaredField(fieldName);
//这在生产设置中通常是不允许的
字段。setAccessible(true);
类fieldType=field.getType();
//下面这句话很难听。
//但这就是我们能做的。我们必须按类别来区分。
if(fieldType.equals(String.class)){
field.set(详细信息,空);
}else if(fieldType.equals(Set.class)){
field.set(详细信息,新HashSet());
}else if(fieldType.toString().equals(“int”)){
字段集(详细信息,0);
}
}
我建议你寻找其他类型的解决方案

使现代化 我们也可以在不进行反射的情况下完成。这仍然很难看,而且容易出错。但至少,它速度很快,而且在prod环境中也可以工作:

public class LeadDetailsSRO {
    private String emailId;
    private String emailByCompany;
    private int level;
    private String alternateNumber;
    private String languagePreference;
    private String kycName;
    private String businessAs;
    private String aadharName;
    private String panName;
    private String ovdName;
    private String kycStatus;
    private String aadhaarStatus;
    private String panStatus;
    private Set<String> ownershipTypeSet;
    private String empId;
    private String designation;
    private Boolean nameMatchSuccess = null;
    private String isSIMandatory;

    public void deleteFields(List<String> fields) {
        for (String fieldName : fields) {
            switch (fieldName) {
            case "emailId":
                this.emailId = null;
                break;
            case "emailByCompany":
                this.emailByCompany = null;
                break;
            // ...
            }
        }
    }
}
公共类LeadDetailsRo{
私有字符串emailId;
私人公司;
私有整数级;
私有字符串交替枚举器;
私有字符串语言偏好;
私有字符串kycName;
私营企业;
私有字符串aadharName;
私有字符串名称;
私有字符串ovdName;
私有字符串kycStatus;
私有字符串aadhaarStatus;
私有字符串泛状态;
私有集所有者类型集;
私有字符串empId;
专用字符串指定;
私有布尔名称匹配成功=null;
私人字符串是强制性的;
公共无效删除字段(列表字段){
for(字符串字段名:字段){
交换机(字段名){
案例“emailId”:
this.emailId=null;
打破
案例“emailByCompany”:
this.emailByCompany=null;
打破
// ...
}
}
}
}

向我们展示您迄今为止尝试过的内容和/或一些显示数组列表和对象定义方式的代码。您可以向我们展示更多内容吗?例如,您迄今为止尝试过的示例代码。此外,示例输入和预期输出也会很有用。@joakim:我不知道如何继续,还没有尝试过任何内容!@tamas:sa此函数的MPE输入将与mergedDiffSRO对象和arraylist deleteFields相同。预期输出是与mergedDiffSRO属于同一类的对象,其中的字段不在对象中,并且在field@ankur43请尝试一下,让我们看看你有什么。没有代码示例,我们无法继续。如何处理类似于private LeadObjects leadobj的案例;请建议进行检查!