The Stream API is designed to work and iterate through one and only one collection and no more.
If you want to achieve such iteration called "zipping", as mentioned in the another answer, you have to iterate the indices. Since Set
is not ordered, you have to use List
instead and know the order is not predictable.
However, the usage of Stream API should be fine here:
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
Few notes:
- To know the highest number you can iterate through, you need ti find a lower from the sizes of the iterables:
Math.min(list.size(), listFromSet.size())
.
map(Collector.toMap(...))
doesn't convert a Stream
to Map
but is not a valid construct, moreover the method map
is not a terminal operation. Use .collect(Collectors.toMap(...))
instead which is.
- Not all the keys from
set
might be used, not all the values from list
might be used, there is no guaranteed order of the keys and the matching key-value will be random.
- If I were to implement this, I'd definetly go for the simple
for-loop
iteration over the Streams.