【问题标题】:Convert ENum array to integer value?将 ENum 数组转换为整数值?
【发布时间】:2018-01-29 15:16:37
【问题描述】:

我有一个枚举:

 public enum ScopeItems {
   BASIC_INFO, POLICY_INFO, USER_INFO
 };

我有许多 Auth 对象,它们可能包含这些范围的任意组合。

我想要做的是根据 Auth 对象持有的这些范围项中的哪一个来分配一个整数值。

例如假设:

BASIC_INFO = 1; POLICY_INFO = 2; USER_INFO = 4;

如果我有一个整数值 5,那么我想返回一个数组:

BASIC_INFO, USER_INFO

我还希望它反向工作,所以如果我传入一个 POLICY_INFO、USER_INFO 数组,我会得到 6 个返回。

我已经完成了这项工作,但我的解决方案似乎有点太复杂了。我敢肯定,我没有想到有更好的方法。

【问题讨论】:

标签: java arrays enums


【解决方案1】:

下面的枚举应该能完成你想要的:

public enum ScopeItems {

    BASIC_INFO(1), POLICY_INFO(2), USER_INFO(4);

    private final int score;
    public int getScore() {
        return score;
    }
    private ScopeItems(int score) {
        this.score = score;
    }

    public static Set<ScopeItems> getScopeByScore(int score) {
        return Stream.of(values()).filter(i -> (i.getScore() | score) == score).collect(Collectors.toSet());
    }

    public static int getScoreByItems(Set<ScopeItems> items) {
        return items.stream().mapToInt(i -> i.getScore()).sum();
    }

};

Klitos 建议在getScopeByStore() 中提高效率:

.collect(Collectors.toSet())   // Inefficient
.collect(Collectors.toCollection(() -> EnumSet.noneOf(ScopeItems.class)) // Better!

以及如何使用它:

ScopeItems.getScopeByScore(5);   // Returns the Set

ScopeItems.getScoreByItems(EnumSet.of(ScopeItems.BASIC_INFO, ScopeItems.POLICY_INFO))  // Returns the score

当前没有验证;如果方法验证了输入,枚举将会改进。

【讨论】:

  • 如果getScopeByScore 返回一个EnumSet 那就太好了,这比.collect(Collectors.toSet())) 给你的Set 的类型更有效。您可以通过.collect(Collectors.toCollection(() -&gt; EnumSet.noneOf(ScopeItems.class))) 实现这一目标。
  • 谢谢,这很完美,而且比我做的更干净! =)
猜你喜欢
  • 1970-01-01
  • 2020-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多