我有一个Role对象,其中包含roleName,roleId和rolePermissions,它也是权限对象列表。
现在我想检索roleName并将其添加到Set并从permissionList检索所有权限并添加到同一个Set以使用pre Java 8实现这一点我使用下面的代码实现了
for (Role role : roleList) {
authorities.add(new SimpleGrantedAuthority(role.getRoleName()));
List<Permission> permissions = role.getPermissions();
for (Permission permission : permissions) {
authorities
.add(new SimpleGrantedAuthority("ROLE_" + permission.getName()));
}
}
使用Java8我已经使用
实现了相同的目标Set<GrantedAuthority> authorities = new HashSet<>();
roleList.stream().parallel().peek(role -> authorities.add(new SimpleGrantedAuthority(role.getRoleName())))
.forEach(role -> role.getPermissions()
.forEach(p -> authorities.add(new SimpleGrantedAuthority("ROLE_" + p.getName()))));
我觉得我们没有充分利用Java8的完整功能,而且上面的方法并不正确。如何更有效地实现同样的目标?
答案 0 :(得分:4)
您可以结合使用flatMap
和Stream.concat
:
Set<GrantedAuthority> authorities =
roleList.stream()
.flatMap(r->Stream.concat(Stream.of(new SimpleGrantedAuthority(r.getRoleName())),
r.getPermissions().stream().map(p->new SimpleGrantedAuthority("ROLE_" + p.getName()))))
.collect(Collectors.toSet());
答案 1 :(得分:3)
由于最终目标是获得未排序的一般集合(和as was pointed out to me on a very related question),您还可以:
Set<GrantedAuthority> authorities = Stream.concat(
roleList.stream().map(role -> new SimpleGrantedAuthority(role.getRoleName())),
roleList.stream().flatMap(role -> role.getPermissions().stream()).map(p -> new SimpleGrantedAuthority("ROLE_" + p.getName()))
).collect(Collectors.toSet());
仅连接角色名称形成的流和角色中每个权限的名称。