我有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整数形式创建权限流的解决方案。
答案 0 :(得分:4)
无法比较int
和Stream
这样的不兼容类型。
从您的显示来看,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());