Создать список перечисления по полю из разделенной запятыми строки в Java - PullRequest
1 голос
/ 01 октября 2019

У меня есть некоторое перечисление, и мне нужно создать список перечислений из строки через запятую. Enum определяется через дополнительное поле. У меня есть:

public enum ReceiverFields {
    FIRST_NAME("firstName"),
    LAST_NAME("lastName"),
    MIDDLE_NAME("middleName");

    private String code;

    private ReceiverFields(String code) {
        this.code = code;
    }

    public String getCode() {
        return code;
    }
}

public class MainClass {

    public static void main(String[] args) {
        List<EnumFields> enumFields = null;
        enumFields = getReceiverFields("enumFirst,enumSecond,enumThird");
        System.out.println(Arrays.toString(enumFields.toArray()));

        enumFields = getReceiverFields("enumFirst,enumThird,somethingOther");
        System.out.println(Arrays.toString(enumFields.toArray()));

        enumFields = getReceiverFields("");
        System.out.println(Arrays.toString(enumFields.toArray()));
    }

    public static List<EnumFields> getReceiverFields(String receiverFields) {
        if (receiverFields == null) {
            return Collections.EMPTY_LIST;
        }

        String[] values = receiverFields.split(",");

        List<EnumFields> valuesList = new ArrayList<>(values.length);
        for (String value : values) {
            for (EnumFields enumField : EnumFields.values()) {
                if (value.equalsIgnoreCase(enumField.getCode())) {
                    valuesList.add(enumField);
                }
            }
        }

        return valuesList;
    }
}

Как я могу использовать поток вместо цикла For?


Редактировать ( изкомментарии ):

Кажется, я решил:

List<EnumFields> valuesList = new ArrayList<>(values.length); 
Arrays.stream(values).forEach(v -> (Arrays.stream(EnumFields.values())
      .filter(e -> (e.getCode().equalsIgnoreCase(v))) 
      .findFirst()) .ifPresent(valuesList::add)); Right?

1 Ответ

0 голосов
/ 01 октября 2019

Вместо использования forEach, как упоминалось в попытке, вы можете использовать flatMap и троичный оператор как:

public static List<ReceiverFields> getReceiverFields(String receiverFields) {
    return receiverFields == null ? Collections.emptyList() : Arrays.stream(receiverFields.split(","))
            .flatMap(value -> Arrays.stream(ReceiverFields.values())
                    .filter(enumField -> value.equalsIgnoreCase(enumField.getCode())))
            .collect(Collectors.toList());
}
...