【问题标题】:Search in Set collections在集合中搜索
【发布时间】:2019-03-10 22:06:16
【问题描述】:

我有一个角色对象,其中有一组角色名称,我想检查用户是否具有特定角色。告诉我如何做到既美观又简洁。

角色.java

@Table(name = "roles")
public class Role {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Enumerated(EnumType.STRING)
    @NaturalId
    @Column(length = 60)
    private RoleName name;

角色名.java:

public enum RoleName {
    ROLE_ADMIN,
    ROLE_MANAGER,
    ROLE_CLIENT,
    ROLE_USER,
}

现在我的搜索看起来像这样:

boolean isFind = false;
        for (Role role : user.getRoles()) {
            isFind = role.getName().equals(RoleName.ROLE_CLIENT);
            if (isFind) break;
        }

但我不是很喜欢这种方式。你能推荐一个更好的选择吗?

【问题讨论】:

  • 备案:您可以使用 == 比较枚举。
  • user.getRoles()返回的是什么类型?如果您可以将其设为Set(理想情况下为EnumSet),那么您的整个代码将折叠为user.getRoles().contains(RoleName.ROLE_CLIENT)
  • 所有集合都有contains(),因为它来自接口Collection<E>
  • 如何使用contains()?它将在Role 的集合中搜索类型RoleName。这样做的唯一方法是覆盖Role 类中的equals 方法
  • contains(),将测试Role是否包含相同的Role对象而不是RoleName,正如@Maxim所说的

标签: java search collections set


【解决方案1】:

您可以使用流,例如:

boolean isFind = 
    user.getRoles()
        .stream()
        .map(Role::getName)
        .anyMatch(n -> n == RoleName.ROLE_CLIENT);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-12
    • 2020-02-04
    • 2019-05-15
    • 1970-01-01
    • 2014-12-24
    • 2019-08-02
    • 2013-12-02
    • 1970-01-01
    相关资源
    最近更新 更多