protected void handleKeyValues( final Iterator<Tuple2<K, V>> itr, IKeyValueConsumer<K, V>... consumer) { if (first == null) return; final K key = first._1(); final Iterator<V> itx = new Iterator<V>() { Tuple2<K, V> current = first; @Override public boolean hasNext() { return current != null; } @Override public V next() { V ret = current._2(); if (itr.hasNext()) { current = itr.next(); if (!current._1().equals(key)) { first = current; current = null; } } else current = null; return ret; } @Override public void remove() { throw new UnsupportedOperationException("Fix This"); // ToDo } }; }
@Override public Iterable<KeyValueObject<KOUT, VOUT>> call(final Iterator<Tuple2<K, V>> itr) throws Exception { first = null; final List<KeyValueObject<KOUT, VOUT>> holder = new ArrayList<KeyValueObject<KOUT, VOUT>>(); if (!itr.hasNext()) return holder; first = itr.next(); final Iterator<V> itx = new Iterator<V>() { Tuple2<K, V> current = first; @Override public boolean hasNext() { if (current == null) return false; return true; } @Override public V next() { V ret = current._2(); if (itr.hasNext()) { Tuple2<K, V> test = itr.next(); if (test._1().equals(first._1())) current = test; else { first = test; // different key current = null; } } else current = null; return ret; } @Override public void remove() { throw new UnsupportedOperationException("Fix This"); // ToDo } }; final Iterable<V> vals = new Iterable<V>() { @Override public Iterator<V> iterator() { return itx; } }; final IKeyValueConsumer<KOUT, VOUT> consumer = new IKeyValueConsumer<KOUT, VOUT>() { @Override public void consume(final KeyValueObject<KOUT, VOUT> kv) { holder.add(kv); } }; K key = (K) first._1(); reducer.handleValues(key, vals, consumer); return holder; }