【问题标题】:Java Initialize EnumBiMap From Two Enum TypesJava 从两种枚举类型初始化 EnumBiMap
【发布时间】:2021-01-23 20:40:00
【问题描述】:

从两种不同的枚举类型初始化 EnumBiMap 最方便的方法是什么?我有以下情况:

public enum First {
  A,
  B,
  C
}

public enum Second {
  ALPHA,
  BETA,
  GAMMA
}

我尝试过类似的东西

        private static EnumBiMap<First, Second> typeMap =
            EnumBiMap<First, Second>.create(
                   Arrays.stream(First.values()).collect(Collectors.toMap(
                            Function.identity(), type -> {
                                switch(type) {
                                    case First.A:
                                        return Second.ALPHA;
                                    case First.B:
                                        return Second.BETA;
                                    default:
                                        return Second.GAMMA
                                }})));

但是我丢失了类型信息,所以我得到了错误。有没有更好的方法来获得这个映射?我也不能菊花链放置,因为 put() 只返回值而不是对地图的引用。就我而言,地图也可以是不可变的。

【问题讨论】:

    标签: java enums bimap


    【解决方案1】:
    import com.google.common.collect.EnumBiMap;
    import com.google.common.collect.Streams;
    import static java.util.Arrays.stream;
    
    EnumBiMap<First, Second> map = EnumBiMap.create(First.class, Second.class);
    Streams.forEachPair(stream(First.values()), stream(Second.values()), map::put);
    

    【讨论】:

      【解决方案2】:

      您映射的方式看起来就像是通常的映射。然后您可以使用枚举的.ordinal() 的序数值来创建映射。

      EnumBiMap<First, Second>.create(
            Arrays.stream(First.values())
                   .collect(Collectors.toMap(Function.identity(),
                                             e -> Second.values()[e.ordinal()])));
      

      【讨论】:

      • 我认为使用 .ordinal() 被认为是不好的做法,因为我们不能保证订单?虽然这是我所追求的映射类型。
      • 我认为使用它被认为是不好的做法取决于枚举值将来是否会发生变化,那么它的可维护性就会降低。一种方法可以使用枚举常量的值,例如 enum First { A(1), B(2),C(3)... Read here 我们不能对订单做出保证 如果您不更改枚举定义中的顺序,则不是这样,顺序将始终一样。
      • 你得到答案了吗?
      猜你喜欢
      • 2011-04-18
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      • 2014-01-19
      • 2017-01-30
      • 2017-10-27
      • 1970-01-01
      相关资源
      最近更新 更多