如何从枚举列表 属性 平面映射到枚举本身?

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 函数将每个元素集合扩展为一个流,每个元素都有一个元素。流的每个元素都是一对,由枚举本身和单个符号组成。然后将这些对收集回地图中。