Перебор в списке и удаление содержимого объекта в Java - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть Arraylist с именем 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");

Как мне продолжить то же самое?Разве отражение будет использоваться для того же?Пожалуйста, предложите какой-нибудь выход с правильным кодом в JAVA .

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Вы можете сделать это с отражением.Но это уродливо, медленно и подвержено ошибкам.Итак, вот оно:

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

Я предлагаю вам поискать другие решения.

Обновление

Мы можем сделать это и без размышлений.Это все еще уродливо и подвержено ошибкам.Но, по крайней мере, это быстро, и это будет работать в среде 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;
            // ...
            }
        }
    }
}
0 голосов
/ 28 ноября 2018

Значения в массиве deleteFields ArrayList должны быть того же типа, что и значения в mergedDiffSRO.Лучшим способом было бы, чтобы mergedDiffSRO также был ArrayList.Тогда вы можете легко удалить значения оттуда так:

    public class DeleteObjectsFromArrayList {
    public static void main(String[] args) {
        ArrayList deleteFields=new ArrayList();
        ArrayList mergedDiffSRO=new ArrayList();

        deleteFields.add("b");
        deleteFields.add("d");
        System.out.println("deleteFields: "+deleteFields.toString());

        mergedDiffSRO.add("a");
        mergedDiffSRO.add("b");
        mergedDiffSRO.add("c");
        mergedDiffSRO.add("d");
        System.out.println("mergedDiffSRO: "+mergedDiffSRO.toString());

        mergedDiffSRO.removeAll(deleteFields);
        System.out.println("mergedDiffSRO - deleteFields = "+mergedDiffSRO);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...