Можно ли сопоставить несколько ключей Map вместо операторов IF внутри forEach? - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь отфильтровать карту и извлечь значения путем сопоставления ключей со строками. Карта и значения могут быть либо строковыми, либо списочными. Ниже приведен фрагмент кода -

container.forEach((k, v) -> {
            if (("userId").equals(k))
                registerContainer.setUserId(v.toString());
            if (("languageId").equals(k))
                registerContainer.setUserLanguage(v.toString());

            if (("formDetails").equals(k)) {

                registerContainer.setFields((ArrayList) v);
            }

            if (("value1").equals(k)) {
                HashMap fieldEntry = new LinkedHashMap<>();
                fieldEntry.put("fieldKey", k);
                fieldEntry.put("fieldValue", v.toString());
                masterParams.add(fieldEntry);
            }
            if (("value2").equals(k)) {
                HashMap fieldEntry = new LinkedHashMap<>();
                fieldEntry.put("fieldKey", k);
                fieldEntry.put("fieldValue", v.toString());
                masterParams.add(fieldEntry);
            }


                if (!CollectionUtils.isEmpty(params)) {

                    registerContainer.setFields(masterParams);
                }

        });

Мой вопрос: есть ли способ исключить все операторы if и при этом иметь желаемый результат?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2020

Или с Java 8:

   container.entrySet().stream().filter(e -> e.getKey().equals("value1")).findFirst()
                .ifPresent(e -> {
                    System.out.println(e.getValue()); 
                });
0 голосов
/ 20 февраля 2020

Вы можете упростить его, используя оператор switch и код squa sh для value1 и value2, поскольку оба они выполняют одно и то же. Вот так вот:

container.forEach((k, v) -> {
            switch(k){
                case "userId":
                    registerContainer.setUserId(v.toString());
                    break;
                case "languageId":
                    registerContainer.setUserLanguage(v.toString());
                    break;
                case "formDetails":
                    registerContainer.setFields((ArrayList) v);
                    break;
                case "value1":
                case "value2":    
                    HashMap fieldEntry = new LinkedHashMap<>();
                    fieldEntry.put("fieldKey", k);
                    fieldEntry.put("fieldValue", v.toString());
                    masterParams.add(fieldEntry);
                    break;
            }
        });
if (!CollectionUtils.isEmpty(params)) {
    registerContainer.setFields(masterParams);
}
...