如何在 Stream API 中将枚举转换为字符串?

How cast Enum to String in Stream API?

public class User {
    private String name;
    private Role role;
 }

enum Role {
    ADMIN, MODERATOR, USER
}

List<User> users = Arrays.asList(
                new User("Alex", Role.USER),
                new User("Tom", Role.ADMIN),
                new User("Bob", Role.MODERATOR),
                new User("Mila", Role.USER),
                new User("Kate", Role.MODERATOR)
        );

Map<Role, Long> count = users.stream()
                .collect(Collectors.groupingBy(User::getRole, Collectors.counting()));

Result : {ADMIN=1, USER=2, MODERATOR=2}

我想按角色分组并计算用户数,使用流API。 当我使用 Map<Role, Long> 时一切正常。

但是我需要 Map<String, Long> 并且有一个编译错误。在这种情况下,我不知道如何将 Enum 转换为 String?

您可以像下面这样操作:

Map<String, Long> r = v.stream().collect(Collectors.groupingBy(u -> u.getRole().toString(), Collectors.counting()));

测试代码:

List<User> v = Arrays.asList(new User("Alex", Role.USER), 
    new User("Tom", Role.ADMIN),
    new User("Bob", Role.MODERATOR), 
    new User("Mila", Role.USER), 
    new User("Kate", Role.MODERATOR));

Map<String, Long> r = v.stream().collect(Collectors.groupingBy(u -> u.getRole().toString(), Collectors.counting()));

System.out.println(r);

输出: {管理员=1,用户=2,版主=2}

角色枚举:

enum Role {
  USER, ADMIN, MODERATOR;
}

通过覆盖枚举中的 toString,您可以映射到任何键。

用户Class:

class User {

  private Role role;

  private String name;

  public User(String name, Role role) {
    this.role = role;
    this.name = name;
  }

  /**
   * @return the domain
   */
  public Role getRole() {
    return role;
  }

  /**
   * @param role
   *          the role to set
   */
  public void setRole(Role role) {
    this.role = role;
  }

  /**
   * @return the name
   */
  public String getName() {
    return name;
  }

  /**
   * @param name
   *          the name to set
   */
  public void setName(String name) {
    this.name = name;
  }

使用 user.getRole().name() 而不是仅 user.getRole()

name() 方法将 return 您定义的名称 Enum(例如 ADMIN)以字符串格式显示。