簡體   English   中英

如何根據某些條件過濾掉枚舉列表?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM