当前位置: 首页 > 知识库问答 >
问题:

如何根据某些标准筛选出枚举列表?

彭展
2023-03-14

假设我有一个班级:

public enum Enums
{
    // about thousand different 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个事件的完整列表,而管理员应该只看到有限的数量。

共有2个答案

上官景铄
2023-03-14

让我们以周日名称为例。见下文

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

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

欧阳嘉年
2023-03-14

假设您的枚举看起来像

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;
    }

EnumSet是为存储一组枚举而优化的特殊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;
    } 
}

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

Set<Enums> adminEnums = Arrays.stream(Enums.values())
        .filter(Enums::isAdminSpecific)
        .collect(Collectors.toSet());
 类似资料:
  • 如何在枚举的帮助下筛选我的“StorageManager”在其名为“items”的LinkedList中的项目?受此筛选器影响的项目需要复制到新的LinkedList中。我用buyNewItem()将项目添加到存储管理器列表中,但第二项任务需要帮助。 如果我忘记添加一些重要信息,请让我知道。 编辑:仅允许重新导入的是 导入java.util.数组; 导入java.util.LinkedList;

  • 我正试图根据一个标准将x个列的数据归零 例如: 第1页: 一月二月三月四月五月六月七月八月九月十月十一月十二月 第2页: 版本(标准)=2 因此,我想选择前两个月,并在1月份将所有数据归零 更新:到目前为止,我得到了这么多,现在我只能选择 我无法让它选择范围。

  • 我希望在我的社交应用程序中实现朋友搜索功能。为此,我尝试在DB的“用户”集合中查询每个用户的文档,但它应该排除一些特定文档,例如当前用户已经是朋友的用户或请求待定的用户。 是否可以通过在Firestore中传递这些文档引用ID来查询所有用户文档,不包括特定文档。 如果没有,有人能说一种结构化数据的方法,以便我可以实现这个功能吗?谢谢。

  • 问题内容: 我正在标准库(例如apache commons,jax,jboss,javax)中寻找一个列出所有标准mime类型(aka content- type)值的接口或枚举。 该接口不应被其他类所困扰,否则将很难将整个类作为gwt源代码包含在内。 例如 要么, 问题答案: 我们为此提供了一个 番石榴 类:。 如源代码和第823期中所述,它是与Guava 12一起发布的。来源也可用。

  • 我有这个枚举(我使用的是TypeScript): 我想在我的表单中构建一个select,每个选项的值为enum整数值,标签为enum文本,如下所示: 我该怎么做?

  • 这是我的密码: 它返回表中所有列的数组。但我不需要把所有的专栏都写下来。我只需要返回以下列:。我对此进行了搜索并找到了答案:(使用函数) 但它并没有返回预期的结果。它返回以下内容: 如您所见,没有和列。我怎样才能修好它?