如何使用Java 8在同一个自定义对象上执行多个操作

时间:2016-10-31 15:52:30

标签: java performance java-8 java-stream

我有一个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的完整功能,而且上面的方法并不正确。如何更有效地实现同样的目标?

2 个答案:

答案 0 :(得分:4)

您可以结合使用flatMapStream.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());

仅连接角色名称形成的流和角色中每个权限的名称。