【问题标题】:Checking list of enums with Java 8 Stream API使用 Java 8 Stream API 检查枚举列表
【发布时间】:2020-02-11 14:02:09
【问题描述】:

这里是 Java 8。我有以下课程:

public enum Role {
  Admin,
  FunUser,
  SeriousUser,
  ...
  BasicUser;
}

@Getter
@Setter
public class User {
  private String login;
  private List<Role> roles;
  ...
}

我想使用 Stream API 编写一些代码来检查当前用户是“Admin”还是“SeriousUser”。

到目前为止,我最好的尝试仍然不是 Java 8ish:

if (user.getRoles().contains(Role.Admin) || user.getRoles().contains(Role.SeriousUser)) {
  ...
}

有没有办法通过 Java 8 Stream API 对几个“樱桃采摘”角色执行此枚举检查?

【问题讨论】:

  • 有什么理由使用List&lt;Role&gt;(重要的订单,需要支持重复)而不是Set&lt;Role&gt;,后者可能是EnumSet&lt;Role&gt;

标签: java java-8 enums java-stream


【解决方案1】:

其他选项:

if(Stream.of(Role.Admin, Role.SeriousUser).anyMatch(user.getRoles()::contains)){
  ...
}

【讨论】:

  • 不需要额外的变量,只需要if(Stream.of(Role.Admin, Role.SeriousUser).anyMatch( user.getRoles()::contains)) …,我们就像 OP 想要的那样“Java 8ish”,同时不增加冗长。尽管如此,原始代码更易读,恕我直言……
  • @Nonika 如果 User.roles 首先是 EnumSet 会更好。然后,迭代可能更短的集合({Admin, SeriousUser} 固定为两个元素)是可取的。
【解决方案2】:

你可以这样做:

if( user.getRoles().stream()
         .anyMatch(role -> role.equals(Role.Admin) || role.equals(Role.SeriousUser))){
   ...
}

【讨论】:

    猜你喜欢
    • 2015-03-04
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    相关资源
    最近更新 更多