Как скопировать элементы типа списка A & B в новый тип списка C, используя поток - PullRequest
2 голосов
/ 23 апреля 2020

У меня есть списки A и List-B, учитывая, что они имеют одинаковую длину. Теперь я хотел бы сгенерировать List- C, скопировав каждое из A и B в C, где C - это класс, состоящий из полей A и B, может подсказать, как мне добиться этого с помощью потока.

Код без использования потока:

int i=0;
List<key> keys = cmdBody.getKeys();
List<value> values = storage.getValues();
List <KeyValue> keyValues = new ArrayList<>();
keys.forEach(key -> {
    KeyValue keyValue = new KeyValue();
    keyValue.setKey(key);
    keyValue.setValue(values.get(i++));
    keyValues.add(keyValue);
});

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Вы можете использовать IntStream , и будет проще, если у вас есть конструктор аргументов в KeyValue class

IntStream.range(0, keys.size())
             .mapToObj(i -> new KeyValue(keys.get(i), values.get(i)))
             .collect(Collectors.toList());
0 голосов
/ 23 апреля 2020

Вот один из способов:

Сначала создайте потоки из двух списков. Затем zip два потока. Чтобы узнать, как сжать два потока, см. здесь .

Теперь вы можете сделать:

zip(keys.stream(), values.stream(), (k, v) -> {
    KeyValue keyValue = new KeyValue();
    keyValue.setKey(k);
    keyValue.setValue(v);
    return keyValue;
}).collect(Collectors.toList());

Было бы действительно полезно, если KeyValue имел AllArgsConstructor, который выглядел примерно так:

public KeyValue(key k, value v) {
    setKey(k);
    setValue(v);
}

, потому что тогда вы могли бы просто сделать:

zip(keys.stream(), values.stream(), KeyValue::new)
    .collect(Collectors.toList());
...