代码之家  ›  专栏  ›  技术社区  ›  GoRobotFlame

按对象集的值过滤对象列表

  •  2
  • GoRobotFlame  · 技术社区  · 8 年前

    我需要检索具有特定角色的用户列表。用户对象包含一组id和角色名称为字符串的角色。 用户JSON示例:

    [  
     {
        "id": "test-id-user2",
        "email": "user2@email.com",
        "password": "$2a$04$JodczCrLPGYA1cCvtAWZoe47qhiBIMNjSexRFwCLevzRJQQSqZvaO",
        "firstName": "Test2",
        "lastName": "User2",
        "enabled": true,
        "confirmationToken": "0123token0123",
        "location": {
          "id": 1,
          "name": "West Vinewood"
        },
        "roles": [
          {
            "id": 1,
            "role": "ROLE_USER"
          }
        ]
      },
      {
        "id": "test-id-admin",
        "email": "admin@email.com",
        "password": "$2a$04$Ll0WUAuU1p.sjqH.g.f03eHcfS8ox1Pen9tYk8/JdWlgfBr71nNO.",
        "firstName": "AdminTest",
        "lastName": null,
        "enabled": true,
        "confirmationToken": null,
        "location": null,
        "roles": [
          {
            "id": 2,
            "role": "ROLE_ADMIN"
          }
        ]
      }
    ]
    

    我可以通过在for循环中使用if循环来实现这一点。用户只有一个角色(出于某些原因,我必须为此使用set):

    List<User> member = new ArrayList<>();
    for (User user : allUsers) {
        Set<UserRole> roles = user.getRoles();
        if (roles.iterator().next().getRole().equals("ROLE_USER")) {
            member.add(user);
        }
    }
    

    有没有其他更简单的方法像lambda一样过滤列表中的集合?我尝试过这个解决方案 Java 8 lambda list inside list filter 它会过滤,但也会复制对象。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Ousmane D.    8 年前

    可以使用流API执行以下操作:

    allUsers.stream()           
            .filter(u -> u.getRoles().iterator().next().getRole().equals("ROLE_USER"))
            .collect(Collectors.toCollection(ArrayList::new));