如何在 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)以字符串格式显示。
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)以字符串格式显示。