java - 如何将字符串列表转换为对象列表?

标签 java java-8 java-stream

我有一个数据库中的角色列表。它们的形式是

application.Role1.read
application.Role1.write
application.Role2.read
application.Role3.read

因此每个角色都有一个基于读/写权限的条目。 我想将角色转换为 POJO,然后我可以将其作为 JSON 发送到 UI。每个 POJO 都有角色名称和一个用于读或写权限的 boolean 值。

这是 RolePermission 类:

import com.fasterxml.jackson.annotation.JsonInclude;

@JsonInclude(JsonInclude.Include.NON_NULL)
public class RolePermission {
    private String roleName;
    private boolean readAllowed;
    private boolean writeAllowed;

    public String getRoleName() {
        return roleName;
    }

    public RolePermission setRoleName(String roleName) {
        this.roleName = roleName;
        return this;
    }

    public boolean isReadAllowed() {
        return readAllowed;
    }

    public RolePermission setReadAllowed(boolean readAllowed) {
        this.readAllowed = readAllowed;
        return this;
    }

    public boolean isWriteAllowed() {
        return writeAllowed;
    }

    public RolePermission setWriteAllowed(boolean writeAllowed) {
        this.writeAllowed = writeAllowed;
        return this;
    }
}

我正在做这样的转变:

public static final String ROLE_PREFIX = "application.";
public static final String ROLE_READ_PERMISSION = "read";
public static final String ROLE_WRITE_PERMISSION = "write";

@Override
public List<RolePermission> getRoles(Backend backend) {
    List<String> allRoles = backend.getRoles()
            .stream()
            .map(s -> s.replace(ROLE_PREFIX, ""))
            .sorted()
            .collect(Collectors.toList());
    Map<String, RolePermission> roleMap = new HashMap<>();
    for (String role : allRoles) {
        String[] tokens = role.split(".");
        String roleName = tokens[0];
        String permission = tokens[1];
        if (!roleMap.containsKey(roleName))
            roleMap.put(roleName, new RolePermission().setRoleName(roleName));
        RolePermission permission = roleMap.get(roleName);
        if (ROLE_READ_PERMISSION.equals(permission))
            permission.setReadAllowed(true);
        if (ROLE_WRITE_PERMISSION.equals(permission))
            permission.setWriteAllowed(true);
    }
    return new LinkedList<>(roleMap.values());
}

有没有办法使用 Java 8 流执行上面的 foreach 循环?

这是一个仅返回角色列表的模拟后端实例:

public class Backend {
    public List<String> getRoles() {
        return Arrays.asList(
            "application.Role1.read",
            "application.Role1.write",
            "application.Role2.read",
            "application.Role3.read"
        );
    }
}

最佳答案

您可以使用 groupingBy将同一 roleName 的不同权限连接在一起。

public static final String ROLE_PREFIX = "application.";
public static final String ROLE_READ_PERMISSION = "read";
public static final String ROLE_WRITE_PERMISSION = "write";

@Override
public List<RolePermission> getRoles(Backend backend) {
    Map<String, List<String[]>> allRoles = backend.getRoles()
            .stream()
            .map(s -> s.replace(ROLE_PREFIX, "")) // something like "Role1.read"
            .map(s -> s.split("\\.")) // something like ["Role1", "read"]
            .collect(Collectors.groupingBy(split -> split[0]));
    return allRoles.values()
                   .stream()
                   .map(this::buildPermission)
                   .collect(Collectors.toList());
}

private RolePermission buildPermission(List<String[]> roleEntries) {
    RolePermission permission = new RolePermission().setRoleName(roleEntries.get(0)[0]);
    roleEntries.stream()
               .forEach(entry -> {
                   if (ROLE_READ_PERMISSION.equals(entry[1]))
                       permission.setReadAllowed(true);
                   if (ROLE_WRITE_PERMISSION.equals(entry[1]))
                       permission.setWriteAllowed(true);
               });
    return permission;
}

我还认为您的 String.split 在原始帖子中使用了不正确的正则表达式,因为 .special regex character .我已经对此进行了测试,它可以正常工作。

输出:

[RolePermission(roleName=Role3, readAllowed=true, writeAllowed=false), 
 RolePermission(roleName=Role2, readAllowed=true, writeAllowed=false),
 RolePermission(roleName=Role1, readAllowed=true, writeAllowed=true)]

关于java - 如何将字符串列表转换为对象列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47143216/

相关文章:

java - 如何在Java 8中同时按desc中的值和键按自然顺序对Map进行排序

java - 使用 Java 8 Stream 替换 for 循环并填充 Map

java - 非静态方法 next() 不能从静态上下文中引用

java - 立即更改 JLabel

java - JBAS011445 : Failed to get adapter for persistence provider using WildFly

JavaFX:将列表绑定(bind)到另一个列表元素的成员属性

java - java中的并发队列消耗之谜

java - 如何使用 Ant 脚本将 XML 文件包含到 jar 的根目录中?

java - JSF h :inputText validation and f:ajax render

java-8 - 将 list<Object> 转换为 java 8 流中的 <Id> 数组