Краткий способ выразить блок кода, используя лямбда и потоки - PullRequest
0 голосов
/ 31 августа 2018

Привет! У меня есть блок кода, который преобразует список оконных объектов одного типа в другой и помещает их в карту, используя идентификатор. Может быть много экземпляров объектов с одинаковым идентификатором, но с разными именем и атрибутом. Я собираюсь взять список [W1 (1,2,3), W1 (2,3,4), W2 (1,3,4) ...] и преобразовать его в Карта [ключ W1, значения (1,2,3), (2,3,4) ключ W2, .... ]

Вот фрагмент кода ...

    List<LinWin> list = winDao.get.....

    Map<Long, List<MacWin>> res = new HashMap<>();
    for (LinWin mw : list) {

        List<MacWin> l2 = res.get(mw.getId());
        if (l2 == null) {
            l2 = new ArrayList<>();
            res.put(mw.getId(), l2);
        }
        l2.add(new MacWin(mw.getName(), mw.getVendor(), mw.isFixed()));
    }

возврат разрешения

Мне было интересно, смогу ли я использовать потоки и лямбды, чтобы свернуть это.

list.stream (). Сбор (Collectors.toMap (.....

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Это действительно можно упростить, если, например, у вас есть метод, который преобразует из LinWin в MacWin (либо сделайте его статическим, либо создайте конструктор для MacWin, который будет принимать LinWin в качестве входных данных) , Я сгенерирую статический метод здесь:

private static MacWin of(LinWin lw){
    return new MacWin(mw.getName(), mw.getVendor(), mw.isFixed());
}

И последующее использование будет (здесь я не использую потоки, так как в этом случае работа без потоков выглядит для меня проще):

Map<Long, List<MacWin>> res = new HashMap<>();
mw.forEach(x -> res.computeIfAbsent(mw.getId(), y -> new ArrayList<>()).add(of(x)));
0 голосов
/ 31 августа 2018

Вы можете сделать это так,

Map<Long, List<MacWin>> macWinById = list.stream()
        .collect(Collectors.groupingBy(LinWin::getId,
            Collectors.mapping(lw -> new MacWin(lw.getName(), lw.getVendor(), lw.isFixed()), 
                Collectors.toList())));

Сначала используйте сборщик groupingBy, чтобы сгруппировать экземпляры Win по их значению id. Затем выполните отображение при передаче нижестоящего collector, который собирает полученные объекты в контейнер.

...