2017-11-06 43 views
6

Tôi có một danh sách các vai trò trong cơ sở dữ liệu. Chúng có dạngLàm thế nào để chuyển đổi một danh sách các chuỗi thành một danh sách các đối tượng?

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

Vì vậy, mỗi vai trò có mục nhập dựa trên quyền đọc/ghi. Tôi muốn chuyển đổi vai trò thành POJO mà sau đó tôi có thể gửi dưới dạng JSON sang giao diện người dùng. Mỗi POJO sẽ có tên vai trò, và một boolean cho phép đọc hoặc ghi.

Đây là lớp 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; 
    } 
} 

Tôi đang làm việc chuyển đổi như sau:

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()); 
} 

Có cách nào để làm vòng lặp foreach trên sử dụng Java 8 suối?

Đây là một trường hợp Backend giả mà chỉ trả về một danh sách các vai trò:

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

Không chắc người tiếp tục bỏ phiếu xuống câu trả lời, nhưng không cung cấp một ở vị trí của họ ... :-( –

Trả lời

4

Bạn có thể sử dụng groupingBy tham gia các điều khoản khác nhau cho các roleName cùng với nhau.

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; 
} 

Tôi cũng nghĩ rằng String.split bạn đã sử dụng một regex không chính xác trong các bài bản gốc, vì . là một special regex character. Tôi đã thử nghiệm này và nó hoạt động chính xác.

Output:

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

Cảm ơn @ durron597. Bạn có thể giúp tôi tìm ra dòng này đang làm gì không? .map (s -> s.replace (ROLE_PREFIX, "") .split ("\\.")) –

+0

@JoseChavez nó giống như những gì bạn có, ngoại trừ tôi đã chuyển 'String.split' lên. Bạn phải sử dụng '\\' vì '.' là một biểu thức regex có nghĩa là" bất kỳ ký tự "nào. Tôi sẽ chỉnh sửa liên kết đến tham chiếu đó vào câu trả lời của tôi. – durron597

+0

Tôi đoán tôi muốn biết kết quả của phương thức "bản đồ" đó là gì? Có phải đó là trả về một chuỗi các chuỗi, nhưng được nhóm theo tên vai trò? –

-1

Các dòng Java có chức năng bản đồ, do đó bạn có thể sử dụng để lập bản đồ String để RolePermission (hoặc bất kỳ đối tượng bạn muốn) và sau đó thu thập các kết quả vào một danh sách. Một cái gì đó giống như công việc này cho bạn? Dường như bạn ít nhiều đã có String để chuyển đổi RolePermission làm

final List<RolePermission> roles = getRoles().stream().map(roleString -> { <your conversion code> }).collect(Collectors.toList()); 
0

loop for của bạn có thể được thay thế bằng cuộc gọi thứ hai của map trong dòng hiện tại của bạn và toMap thu:

public List<RolePermission> getRoles(Backend backend) 
{ 
    Map<String, RolePermission> allRoles = backend.getRoles() 
      .stream() 
      .map(s -> s.replace(ROLE_PREFIX, "")) 
      .sorted() 
      .map(this::mapStringToRolePermission) 
      .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, RolePermission::merge)); 
    return new ArrayList<>(allRoles.values()); 
} 

nơi mapStringToRolePermission :

private static Map.Entry<String, RolePermission> mapStringToRolePermission(String role) 
{ 
    String roleName = role.substring(0, role.indexOf('.')); 
    RolePermission rolePermission = new RolePermission(); 
    rolePermission.setRoleName(roleName); 
    rolePermission.setReadAllowed(role.endsWith(ROLE_READ_PERMISSION)); 
    rolePermission.setWriteAllowed(role.endsWith(ROLE_WRITE_PERMISSION)); 
    return new AbstractMap.SimpleEntry<>(roleName, rolePermission); 
} 

và phương thức bổ sung merge fo r RolePermission:

public RolePermission merge(RolePermission another) 
{ 
    if (another.isReadAllowed()) 
     setReadAllowed(true); 
    if (another.isWriteAllowed()) 
     setWriteAllowed(true); 
    return this; 
} 
Các vấn đề liên quan