将ENum数组转换为整数值?

时间:2018-01-29 15:16:37

标签: java arrays enums

我有一个枚举:

 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回。

我有这个工作,但我的解决方案似乎有点太复杂了。我确信有更好的方法可以解决这个问题,我没想到。

1 个答案:

答案 0 :(得分:3)

以下枚举应该可以达到你想要的效果:

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

目前没有验证;如果方法验证了输入,则枚举将得到改善。