Фильтровать список объектов по значению наборов объектов - PullRequest
0 голосов
/ 15 мая 2018

Мне нужно получить список пользователей с определенной ролью.Пользовательский объект содержит набор ролей с идентификатором и именем роли в виде строки.Пример 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"
      }
    ]
  }
]

Я могу добиться этого с помощью цикла if внутри цикла for.У пользователя есть только одна роль (и по некоторым причинам я должен использовать 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);
    }
}

Есть ли другой, более простой способ, как лямбда-фильтр для фильтрации набора внутри списка?Я пробовал это решение лямбда-список Java 8 внутри фильтра списка оно фильтрует, но оно также дублирует объект.

1 Ответ

0 голосов
/ 15 мая 2018

Это можно сделать следующим образом с помощью потокового API:

allUsers.stream()           
        .filter(u -> u.getRoles().iterator().next().getRole().equals("ROLE_USER"))
        .collect(Collectors.toCollection(ArrayList::new));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...