如何根据某些条件过滤出枚举列表?



假设我有一个类:

public enum Enums
{
// about thousand different Enums 
}

我还有另一个用户登录的类,根据他是管理员还是普通用户,用户可以访问有限的枚举列表。我知道我可以从类中获取所有枚举的完整列表,但是在 Enums 类不知道用户信息的情况下,通过某些条件过滤这些枚举的优雅方法是什么?

编辑: 以下是它今天的样子的截图:

@GET
@RolesAllowed({ADMIN})
@Path("/test")
public Response reply(@Auth User user)
{
JSONObject jsonObject = new JSONObject();
jsonObject.put("enums", Arrays.toString(Enums.values()));
return Response.ok(jsonObject.toJSONString()).build();
}

我正在返回 1000+ 事件的完整列表,而管理员应该只看到有限的数量。

让我们以工作日名称为例作为枚举。见下文

public enum DaysOfWeekEnum {
SUNDAY("off"), 
MONDAY("working"), 
TUESDAY("working"), 
WEDNESDAY("working"), 
THURSDAY("working"), 
FRIDAY("working"), 
SATURDAY("off");
private String typeOfDay;
DaysOfWeekEnum(String typeOfDay) {
this.typeOfDay = typeOfDay;
}
// standard getters and setters 
public static Stream<DaysOfWeekEnum> stream() {
return Stream.Of(DaysOfWeekEnum.values()); 
}
}

现在我们将编写一个示例来打印非工作日:

public class EnumStreamExample {
public static void main() {
DaysOfWeekEnum.stream()
.filter(d -> d.getTypeOfDay().equals("off"))
.forEach(System.out::println);
}
}

运行以下命令时得到的输出:

SUNDAY
SATURDAY

对不起,我在电话里,请在回答中格式化代码。

假设您的枚举看起来像

private enum Enums {
A,
B,
C,
D
}

其中 A、B 是特定于管理员的。

创建一个类,该类允许根据此人是否为管理员来访问枚举。

public class SO {
EnumSet<Enums> adminEnums = EnumSet.allOf(Enums.class);
EnumSet<Enums> nonAdminEnums = EnumSet.of(Enums.C, Enums.D);
public Set<Enums> getEnums(User user) {
boolean isAdmin = user.isAdmin(); //An example
return isAdmin ? adminEnums : nonAdminEnums;
}

枚举集是一种特殊的 Set 实现,针对存储一组枚举进行了优化。adminEnums存储所有枚举的列表,而nonAdminEnums具有有限的枚举集。

您必须为 admin 显式指定受限枚举的列表,或者指定打开的枚举并基于此派生另一个枚举。这不仅乏味而且容易出错。将来,当您添加新的枚举实例时,您也必须更新它,并且很容易忘记这一点。

如果枚举本身包含这样的信息会更好,

private enum Enums {
A(false),
B(false),
C(true),
D(true);
private boolean adminSpecific;
Enums(boolean adminSpecific) {
this.adminSpecific = adminSpecific;
}
public boolean isAdminSpecific() {
return adminSpecific;
} 
}

在这种情况下,我们可以根据枚举实例中包含的信息导出列表。

Set<Enums> adminEnums = Arrays.stream(Enums.values())
.filter(Enums::isAdminSpecific)
.collect(Collectors.toSet());

最新更新