java - 在 Java 中根据逗号分隔的字符串按字段创建枚举列表

标签 java java-8 java-stream

我有一些枚举,我需要从逗号分隔的字符串创建一个枚举列表。枚举是通过附加字段定义的。我有:

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?

<小时/>

编辑 ( from the comments ):

我似乎已经决定:

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?

最佳答案

您可以使用 flatMap 和三元运算符,而不是像尝试中提到的那样使用 forEach :

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

关于java - 在 Java 中根据逗号分隔的字符串按字段创建枚举列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58190755/

相关文章:

Java 8 groupingby 进入包含列表的映射

java - Spring 和 Velocity - 表单处理

java - 难以从 Nav Drawer 访问 SwitchCompat

java - 通过过滤器列表运行字符串列表

java - 我可以使用流从字符串列表中拆分项目吗?

java - 为分层实体设计界面

java - 使用 Streams 将 3 个数组转换为 1 个对象数组

java - Android Sqlite 内连接

Java 运算符 ? :

java - Java 8 Comparator 类型推断非常困惑