Kam*_*mil 1 java collections for-loop java-8 java-stream
我有以下课程:
public class Role {
private Integer id;
private String name;
private String description;
//getters and setters
}
Run Code Online (Sandbox Code Playgroud)
public class UserRole {
private Integer id;
private User user;
private Role role;
//getters and setters
}
Run Code Online (Sandbox Code Playgroud)
public class RoleCheckbox {
private Role role;
private Boolean checked;
//getters and setters
}
Run Code Online (Sandbox Code Playgroud)
现在在我的服务类中,我得到了 Role 和 UserRole 对象的列表。角色列表包含所有可用角色,用户角色列表包含分配给特定用户的角色。
我想比较这两个列表并创建一个 RoleCheckbox 对象列表。因此,新创建的列表应包含所有角色和“已检查”字段,其值取决于用户的角色。
我已经解决了如下:
this.roleCheckboxes = new ArrayList<RoleCheckbox>();
for(Role role : roles) {
Boolean checked = false;
for (UserRole userRole : user.getUserRoles()) {
if(userRole.getRole() == role)
checked = true;
}
RoleCheckbox roleCheckbox = new RoleCheckbox(role, checked);
this.roleCheckboxes.add(roleCheckbox);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何使用 Streams 做到这一点?或者如何重构代码以使其更具可读性和友好性?
等效流可以是:
this.roleCheckboxes = roles.stream()
.map(role ->
new RoleCheckbox(
role,
user.getUserRoles().stream()
.anyMatch(userRole -> userRole.getRole() == role)
)
)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
笔记
在您使用的代码中userRole.getRole() == role
,我认为这是错误的,因为您在两个对象之间进行比较,并且==
不正确,我认为您的意思是userRole.getRole().equals(role)