如何在Java流过滤器中使用Java流映射

时间:2019-09-09 08:37:21

标签: java java-stream

我有2个数组,只想使用流将两个数组中的元素都列为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'

我理解该错误,但是我不知道如何仅以permission.getRoleId整数形式创建权限流的解决方案。

2 个答案:

答案 0 :(得分: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());

答案 1 :(得分:3)

您可以做的是将roleId数组的唯一Permission收集到Set中作为计算结果,并在迭代过程中执行contains检查Role个数组。可以这样完成:

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());