[英]How do I filter out a list of enums based on some criteria?
假設我有一個 class:
public enum Enums
{
// about thousand different Enums
}
我還有另一個 class 用戶登錄,並且根據他是管理員還是普通用戶,用戶可以訪問有限的枚舉列表。 我知道我可以從 class 中獲取所有枚舉的完整列表,但是在枚舉 class 不知道用戶信息的情況下,按照某些標准過濾這些枚舉的優雅方法是什么?
編輯:這是今天的樣子:
@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);
}
}
當我們運行這個時,我們得到的 output:
SUNDAY
SATURDAY
對不起,電話,請在回答中格式化代碼。
讓我們說你的枚舉看起來像
private enum Enums {
A,
B,
C,
D
}
其中 A,B 是特定於管理員的。
創建一個 class 允許基於此人是否為管理員訪問枚舉。
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;
}
EnumSet 是一種特殊的 Set 實現,針對存儲一組枚舉進行了優化。 adminEnums
存儲所有枚舉的列表,而nonAdminEnums
具有有限的枚舉集。
您要么必須為管理員明確指定受限枚舉列表,要么指定開放枚舉並基於此派生另一個。 這不僅乏味而且容易出錯。 將來,當您添加新的枚舉實例時,您也必須更新它,很容易忘記這一點。
如果枚舉本身包含這樣的信息會更好,
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());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.