【问题标题】:How can I flat map from an enum list property to the enum itself?如何从枚举列表属性平面映射到枚举本身?
【发布时间】:2021-11-12 09:03:18
【问题描述】:

给定以下枚举:

@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&lt;Integer, SampleEnum&gt;

【问题讨论】:

  • 您可以先flatMap 将您的列表配对,然后再将这些配对收集到地图中。
  • @4EACH,请提供完整列表。这样我们就可以运行它了。
  • @I.G.就是这个。数组和枚举值之间没有重复

标签: java enums java-stream


【解决方案1】:

添加一对:

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 创建 int+enum 对:

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}

【讨论】:

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

    【讨论】:

    • 我收到了,Non-static method cannot be referenced from a static context
    • 奇怪,当我将它直接添加到您的 SampleEnum 类时,这对我来说效果很好。
    猜你喜欢
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多