使用 Streams 比较和组合两个不同类型的列表

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 做到这一点?或者如何重构代码以使其更具可读性和友好性?

YCF*_*F_L 5

等效流可以是:

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)