public MultiDistinctOrderedIterator(final Integer lowLimit, final Integer highLimit, final List<Iterator<E>> iterators, final List<OrderEntry> orders) { this.limit = highLimit; Comparator<E> comparator = null; if (orders.isEmpty()) { final Stream<E> stream = StreamSupport.stream(Spliterators.spliteratorUnknownSize(Iterators.concat(iterators.iterator()), Spliterator.ORDERED), false); this.iterators.put(0, stream.iterator()); } else { final List<Comparator<E>> comp = new ArrayList<>(); orders.forEach(o -> comp.add(new ElementValueComparator(o.key, o.order))); comparator = new MultiComparator<>(comp); for (int i = 0; i < iterators.size(); i++) { this.iterators.put(i, iterators.get(i)); } } currentElements = new TreeMap<>(comparator); long i = 0; while (i < lowLimit && this.hasNext()) { this.next(); i++; } }