Java 8 Сопоставить со списком объектов с одним полем, сгруппированным в список - PullRequest
2 голосов
/ 10 мая 2019

Вопрос новичка. У меня есть исходный бин, поступающий из БД по строкам как

public class DataBean {
   private Integer employeeId;
   private String org;
   private String comments;
   // + Constructors, getters/setters
}

Мне нужно сопоставить его с другим компонентом с несколькими организациями, сгруппированными по идентификатору сотрудника в список. Только Orgs могут быть множественными для EmployeeID; Поле комментариев гарантированно будет таким же.

public class CustomDataBean {
   private Integer employeeId;
   private List<String> orgs;
   private String comments;
   // + Constructors, getters/setters
}

Изо всех сил, чтобы начать. Я думал о groupingBy, таком как ниже, но это возвращает карту, и я не строю подсписок.

Map<Integer, List<String>> temp = origData.stream().collect(
    Collectors.groupingBy(OrigBean::getEmployeeId,
    /* 2nd param? */ .. ))

Моя цель - преображенный List<CustomDataBean>.

Ответы [ 2 ]

5 голосов
/ 10 мая 2019

Вы можете просто использовать это:

List<CustomDataBean> result = origData.stream()
        .collect(Collectors.groupingBy(DataBean::getEmployeeId))
        .entrySet().stream()
        .map(e -> new CustomDataBean(
                e.getKey(),
                e.getValue().stream().map(DataBean::getOrg).collect(Collectors.toList()),
                e.getValue().get(0).getComments()))
        .collect(Collectors.toList());

Это сопоставляет сгруппированные результаты с вашим CustomDataBean объектом.

Для ввода:

List<DataBean> origData = Arrays.asList(
        new DataBean(1, "a", "c"),
        new DataBean(1, "b", "c"),
        new DataBean(1, "c", "c"),
        new DataBean(2, "a", "d"),
        new DataBean(2, "c", "d")
);

Theрезультат будет таким:

CustomDataBean[employeeId=1, orgs=[a, b, c], comments='c']
CustomDataBean[employeeId=2, orgs=[a, c], comments='d']
2 голосов
/ 10 мая 2019

Чтобы ответить на оба вопроса, используйте Collectors.mapping в качестве нижестоящего как:

Map<Integer, List<String>> temp = origData.stream().collect(
        Collectors.groupingBy(DataBean::getEmployeeId,
                Collectors.mapping(DataBean::getOrg, Collectors.toList())));

и далее, достигните своей цели, чтобы получить List<CustomDataBean> как:

List<CustomDataBean> goal = origData.stream()
        .map(a -> new CustomDataBean(a.getEmployeeId(), temp.get(a.employeeId), a.getComments()))
        .collect(Collectors.toList());
...