如何从枚举列表 属性 平面映射到枚举本身?
How can I flat map from an enum list property to the enum itself?
给定以下枚举:
@Getter
@AllArgsConstructor
public enum SampleEnum {
A("aaa", Arrays.asList(1,2,3,4)),
B("bbb", Arrays.asList(5,6,7,8,9)),
C("ccc", Arrays.asList(10,11)),
D("ddd", new ArrayList<>());
private final String code;
private final List<Integer> symbols;
// It does not work on arrays
private static final Map<String, SampleEnum> CODE_TO_ENUM_MAP =
stream(values()).collect(toMap(SampleEnum ::getCode, t -> t));
}
我想在列表中的每个符号与枚举值之间创建映射。
预期地图:Integer
-> SampleEnum
1 -> A
2 -> A
3 -> A
4 -> A
5 -> B
6 -> B
7 -> B
8 -> B
9 -> B
10 -> C
11 -> C
如何创建这个 Map<Integer, SampleEnum>
?
添加一对:
static class EnumWithValue {
SampleEnum sampleEnum;
int value;
public EnumWithValue(SampleEnum sampleEnum, int value) {
this.sampleEnum = sampleEnum;
this.value = value;
}
public SampleEnum getSampleEnum() {
return sampleEnum;
}
public int getValue() {
return value;
}
}
使用flatMap
创建整数+枚举对:
private static final Map<Integer, SampleEnum > CODE_TO_ENUM_MAP =
Arrays.stream(values())
.flatMap(e -> e.getSymbols().stream().map(symbol -> new EnumWithValue(e, symbol)))
.collect(Collectors.toMap(EnumWithValue::getValue, EnumWithValue::getSampleEnum));
正在执行:
public static void main(String[] args) {
System.out.println(CODE_TO_ENUM_MAP);
}
打印:
{1=A, 2=A, 3=A, 4=A, 5=B, 6=B, 7=B, 8=B, 9=B, 10=C, 11=C}
private static final Map<Integer, SampleEnum> SYMBOL_TO_ENUM_MAP =
Arrays.stream(values())
.flatMap(e -> e.symbols.stream().map(s -> Map.entry(s, e)))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
这里的关键见解是使用 flatMap
函数将每个元素集合扩展为一个流,每个元素都有一个元素。流的每个元素都是一对,由枚举本身和单个符号组成。然后将这些对收集回地图中。
给定以下枚举:
@Getter
@AllArgsConstructor
public enum SampleEnum {
A("aaa", Arrays.asList(1,2,3,4)),
B("bbb", Arrays.asList(5,6,7,8,9)),
C("ccc", Arrays.asList(10,11)),
D("ddd", new ArrayList<>());
private final String code;
private final List<Integer> symbols;
// It does not work on arrays
private static final Map<String, SampleEnum> CODE_TO_ENUM_MAP =
stream(values()).collect(toMap(SampleEnum ::getCode, t -> t));
}
我想在列表中的每个符号与枚举值之间创建映射。
预期地图:Integer
-> SampleEnum
1 -> A
2 -> A
3 -> A
4 -> A
5 -> B
6 -> B
7 -> B
8 -> B
9 -> B
10 -> C
11 -> C
如何创建这个 Map<Integer, SampleEnum>
?
添加一对:
static class EnumWithValue {
SampleEnum sampleEnum;
int value;
public EnumWithValue(SampleEnum sampleEnum, int value) {
this.sampleEnum = sampleEnum;
this.value = value;
}
public SampleEnum getSampleEnum() {
return sampleEnum;
}
public int getValue() {
return value;
}
}
使用flatMap
创建整数+枚举对:
private static final Map<Integer, SampleEnum > CODE_TO_ENUM_MAP =
Arrays.stream(values())
.flatMap(e -> e.getSymbols().stream().map(symbol -> new EnumWithValue(e, symbol)))
.collect(Collectors.toMap(EnumWithValue::getValue, EnumWithValue::getSampleEnum));
正在执行:
public static void main(String[] args) {
System.out.println(CODE_TO_ENUM_MAP);
}
打印:
{1=A, 2=A, 3=A, 4=A, 5=B, 6=B, 7=B, 8=B, 9=B, 10=C, 11=C}
private static final Map<Integer, SampleEnum> SYMBOL_TO_ENUM_MAP =
Arrays.stream(values())
.flatMap(e -> e.symbols.stream().map(s -> Map.entry(s, e)))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
这里的关键见解是使用 flatMap
函数将每个元素集合扩展为一个流,每个元素都有一个元素。流的每个元素都是一对,由枚举本身和单个符号组成。然后将这些对收集回地图中。