如何在Java Stream过滤器内使用Java Stream Map

3

我有两个数组,想要使用流创建一个只包含在两个数组中的元素role.getRoleName()的列表。

final List<String> roleNames = new ArrayList<>();
roleNames = Arrays.stream(roles).filter(role -> role.getRoleId() 
== Arrays.stream(permissions).map(permission -> permission.getRoleId()));

当我编写上述代码时,我会得到以下错误信息:

无法将“int”、“java.util.stream.Stream”应用于运算符“==”

我理解这个错误,但我不知道如何让permissions流仅包含permission.getRoleId整数。

使用.equals怎么样?还是在roleId上。如果permission.getRoleId是整数,为什么要将类似的数据收集为List<String>呢? - Naman
roleId 是整数类型而 roleName 是字符串类型。我想将 roleName 添加到列表中。 - Milan Panic
2个回答

4

无法将不兼容的类型,如intStream进行比较。

根据您展示的内容,Stream#anyMatch可能是一个很好的选择。

roleNames = Arrays.stream(roles)
    .map(Role::getRoleId)
    .filter(id -> Arrays.stream(permissions).map(Role::getRoleId).anyMatch(p -> p.equals(id)))
    .collect(Collectors.toList());

这部分 Arrays.stream(permissions).map(Role::getRoleId) 可以预先计算并存储到一个 Set 中。

final Set<Integer> set = Arrays.stream(permissions)
                               .map(Role::getRoleId)
                               .collect(Collectors.toSet());

roleNames = Arrays.stream(roles)
                  .filter(role -> set.contains(role.getRoleId()))
                  .map(Role::getRoleName)
                  .collect(Collectors.toList());

3
你可以采集由一个 Permission 数组中独特的roleId构成的 Set 作为计算结果,并在遍历 Role 数组时执行 contains 检查。示例代码如下:
final Set<Integer> uniqueRoleForPermissions = Arrays.stream(permissions)
        .map(Permission::getRoleId)
        .collect(Collectors.toSet());
final List<String> roleNames = Arrays.stream(roles)
        .filter(role -> uniqueRoleForPermissions.contains(role.getRoleId()))
        .map(Role::getRoleName)
        .collect(Collectors.toList());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接