как сгруппировать элементы и преобразовать в список в java - PullRequest
0 голосов
/ 09 мая 2020

У меня есть DTO, как показано ниже

public class UserDTO implements Serializable {
    private String id;
    private String fullName;
    private String phone;
    private String role;
    private List<String> roleList;

    public UserDTO(String id, List<String> roleList) {
        super();
        this.id = id;
        this.roleList = roleList;
    }
}

У меня есть список UserDTO, где roleList не заполняется, а role заполняется. Проблема в том, что role может быть несколько, но почему-то мне не удается получить список в одном запросе. Итак, я хочу сгруппировать по идентификатору и сгенерировать roleList.

Например, у меня есть следующие строки:

id     fullName     phone     role     roleList
------------------------------------------------
abc    Sarwar       017xxx    admin    NULL
abc    Sarwar       017xxx    operator NULL

I want it to be like the following 

abc    Sarwar       017xxx    NULL      ArrayList<String>(admin, operator)

Я пробовал следующее, но это не работает (не следует Хотя, но я не могу понять, что это должно быть) поэтому я ищу вашей помощи:

Map<String, List<UserDTO>> resultsWithSameIdAndName = users.stream()
        .collect(Collectors.groupingBy(r -> r.getId()));

List<UserDTO> mergedResults = resultsWithSameIdAndName.entrySet().stream()
        .map(e -> new UserDTO(e.getKey(), 
                e.getValue().stream().map(r -> r.getRole()).collect(Collectors.toList())))
        .collect(Collectors.toList());

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 09 мая 2020

Ваш код должен работать. Я добавил к этому другой способ.

Сначала подготовьте карту для roleList пользователем id

Map<String, List<String>> resultsWithSameIdAndName = users.stream()
        .collect(Collectors.groupingBy(UserDTO::getId,
                 Collectors.mapping(d-> d.getRole(), Collectors.toList())));

Затем создайте уникальный список пользователей пользователем id

List<UserDTO> uniqueUsers = users.stream()
    .collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(UserDTO::getId))),ArrayList::new));

И получить список ролей с карты и установить для каждого пользователя

for(UserDTO user :uniqueUsers) {
    user.setRoleList(resultsWithSameIdAndName.get(user.getId()));
}
1 голос
/ 09 мая 2020

Это может сработать для вас:

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class UserDTO  {
    private String id;
    private String fullName;
    private String phone;
    private String role;
    private List<String> roleList;

    public UserDTO(String id,String fullName,String phone,String role) {
        this.id = id;
        this.fullName = fullName;
        this.phone = phone;
        this.role =role;
    }

    public UserDTO(UserDTO oldObject,String key, List<String> collect) {
        this.id = key;
        this.fullName = oldObject.getFullName();
        this.phone = oldObject.getPhone();
        this.roleList = collect;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getFullName() {
        return fullName;
    }

    public void setFullName(String fullName) {
        this.fullName = fullName;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }

    public List<String> getRoleList() {
        return roleList;
    }

    public void setRoleList(List<String> roleList) {
        this.roleList = roleList;
    }
    public static void main(String[] args) {

        ArrayList<UserDTO> list = new ArrayList<>();
        list.add(new UserDTO("ASD", "John", "12345", "user"));
        list.add(new UserDTO("ASD", "John", "12345", "admin"));
        list.add(new UserDTO("SDB", "Smith", "12345", "super user"));
        list.add(new UserDTO("SDB", "Smith", "12345", "admin"));
        list.add(new UserDTO("DFG", "Neo", "12345", "user"));
        Map<String, List<UserDTO>> resultsWithSameIdAndName = list.stream().collect(Collectors.groupingBy(UserDTO::getId));
        List<UserDTO> mergedResults = resultsWithSameIdAndName.entrySet().stream()
                .map(e -> new UserDTO(
                        e.getValue().get(0),
                        e.getKey(),
                        e.getValue().stream().map(UserDTO::getRole).collect(Collectors.toList())))
                .collect(Collectors.toList());
        System.out.println(mergedResults);

    }

}

Только изменения, которые я сделал, добавляются в конструктор, который принимает объект UserDTO.

...