Многократная итерация списка и связь данных от одного до другого - PullRequest
0 голосов
/ 31 марта 2019

У меня есть два ArrayLists -> один со строкой меток, второй с объектами, у которых есть переменная, для которой можно установить метку.Размер обоих списков одинаков.Есть ли способ сделать это одновременно и аккуратно в Java 8, используя Stream API

Я могу сделать это, используя цикл for и устанавливая их одновременно, но есть ли лучший способ сделать это с помощью Streams APIs

        List<Items> items = new ArrayList<>();
        for(int i =0 ; i<11 ;i++)
            items.add(new Item());
        List<String> labels = new ArrayList<String>() {{
            add("2.11");
            add("2.12");
            add("2.10");
            add("2.1");
            add("1.1");
            add("1.1");
            add("1.0");
            add("2.12");
            add("1");
            add("1");
            add("2.01");
        }};
        for(int i=0;i <11 ; i++){
                   items.get(i).setLabel(labels.get(i));
        }

Каждый объект предмета должен иметь набор меток на основе списка меток.

1 Ответ

0 голосов
/ 31 марта 2019

Мы можем использовать IntStream.range() для генерации диапазона индексов и, используя эти индексы, мы можем заполнить каждый элемент из списка items:

List<Item> list = IntStream.range(0, labels.size())
                                   .mapToObj(idx -> { Item item = items.get(idx); item.setLabel(labels.get(idx)); return item; })
                                   .collect(Collectors.toList());

Мы также можем поддерживать счетчик индекса final AtomicInteger, чтобы отслеживать индекс списка labels и, наконец, использовать пользовательский Collector:

final AtomicInteger idx = new AtomicInteger();
List<Item> result = items.stream()
                         .collect(ArrayList::new, 
                          (list, item) -> { item.setLabel(labels.get(idx.getAndIncrement())); 
                                            list.add(item);
                                          }, 
                          ArrayList::addAll);
...