java - 将双嵌套 for 循环重写为 Java 8 流

标签 java java-8 java-stream

我有以下 Java 方法:

public List<GrantedAuthority> toAuthorities(Set<Role> roles) {
    List<GrantedAuthority> authorities = new ArrayList<>();

    if (null != roles) {
        for (Role role : roles) {
            for (Permission permission : role.getPermissions()) {
                authorities.add(new SimpleGrantedAuthority("ROLE_" + permission.getLabel()));
            }
        }
    }

    return authorities;
}

我正在尝试使用 Java 8 流重写它。迄今为止我的最佳尝试:

public List<GrantedAuthority> toAuthorities(Set<Role> roles) {
    List<GrantedAuthority> authorities = new ArrayList<>();

    if (null != roles) {
        roles.stream().filter(role -> ???).collect(Collectors.toList());
    }

    return authorities;
}

但是我不知道我在流过滤器中放了什么(替换 ???)...有什么想法吗?

最佳答案

您可以使用 flatMapmap 代替:

if (null != roles) {
    authorities = roles.stream()
         .flatMap(role -> role.getPermissions().stream()) // Stream<Permission>
         .map(permission -> 
                 new SimpleGrantedAuthority("ROLE_" + permission.getLabel())) // Stream<SimpleGrantedAuthority>
         .collect(Collectors.toList());
}

for 循环代码中,您不会根据条件筛选出/在任何迭代中并在整个列表中迭代,因此您不需要 filter在这里。


使用上面的方法,你的完整方法可以写成:

public List<GrantedAuthority> toAuthorities(Set<Role> roles) {
    return roles == null ? new ArrayList<>() : roles.stream()
            .flatMap(role -> role.getPermissions().stream())
            .map(permission -> new SimpleGrantedAuthority("ROLE_" + permission.getLabel()))
            .collect(Collectors.toList());
}

或作为 suggested by shmosel ,使用方法引用可以将其转换为:

return roles == null ? new ArrayList<>() : roles.stream()
        .map(Role::getPermissions)
        .flatMap(Collection::stream)
        .map(Permission::getLabel)
        .map("ROLE_"::concat)
        .map(SimpleGrantedAuthority::new)
        .collect(Collectors.toList());

关于java - 将双嵌套 for 循环重写为 Java 8 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52979975/

相关文章:

Java使用输入流从外部程序读取标准输出

java - 使用 ubuntu 镜像在 dockerfile 中安装 JDK 8 update 172

java - 无法将 ISO 8601 格式的字符串解析为 Java 8 日期,在偏移量中缺少冒号

java - 以某种方式使用错误的 JDK(?)构建 Android 应用程序

java - 检测流中的重复组

java - 嵌套的正则表达式和替换

java - volatile 数组的奇怪行为

java - 类似 Facebook 的 PrimeFaces 组件 "Notifications"(右上角的小消息)

java - 如何使用流来编写它? Java 8

Java 8 流 API :How to handle null value in Map