我有一个枚举:
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回。
我有这个工作,但我的解决方案似乎有点太复杂了。我确信有更好的方法可以解决这个问题,我没想到。
答案 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
目前没有验证;如果方法验证了输入,则枚举将得到改善。