我有一些枚举,我需要从逗号分隔的字符串创建一个枚举列表。枚举是通过附加字段定义的。我有:
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/