Stream API предназначен для работы и перебора одной и только одной коллекции и не более.
Если вы хотите выполнить такую итерацию, которая называется «zip», как упоминалось в другом ответе, вы должны выполнить итерации индексов. Так как Set
не заказан, вы должны использовать вместо него List
и знать, что порядок не предсказуем.
Однако использование Stream API здесь должно быть хорошо:
Set<MyObject> set = ... // MyObject with getId method
List<MyObject> listFromSet = new ArrayList<>(set);
List<MyObject> list = ... // existing list
IntStream.range(0, Math.min(list.size(), listFromSet.size()))
.mapToObj(index -> new AbstractMap.SimpleEntry<>(
listFromSet.get(index).getId(), // key
list.get(index)) // value
)
.collect(Collectors.toMap(Entry::getKey, Entry::getValue)); // to Map
Несколько замечаний:
- Чтобы узнать наибольшее число, которое вы можете перебрать, вам нужно найти меньшее из размеров итерируемых элементов:
Math.min(list.size(), listFromSet.size())
. map(Collector.toMap(...))
число не преобразуйте Stream
в Map
, но не является допустимой конструкцией, более того, метод map
не является терминальной операцией. Вместо этого используйте .collect(Collectors.toMap(...))
. - Можно использовать не все ключи из
set
, не все значения из list
, не существует гарантированного порядка ключей и соответствующего ключа -значение будет случайным. - Если бы я это реализовал, я бы определенно go за простую итерацию
for-loop
над потоками.