OpenJDK / lambda / lambda / jdk
changeset 6043:51d2d8fa4673
MapSortedOp<K,V> as
SortedOp<Mapping<K,V>> with help from ChainedMapAdapter, it's like
MapIteratorAdapter, just for sink.
With that, now we can both direction interchangeability as Sink.OfMap
support accept(Mapping<K,V>) and Adapter can take
CahinedValue<Mapping<K,V>> to accept(K,V).
I'll need to implement a test for MapSortedOp, and I think it is
possible to further combine MapSortedOp and SortedOp use the similar
make pattern.
The drawback is that there is actually an extra layer setup, but
wishfully compiler will be able to inline those adapters?
author | henryjen |
---|---|
date | Fri, 21 Sep 2012 16:30:57 -0700 |
parents | 1afc754700b1 |
children | 0c92c66120f5 |
files | src/share/classes/java/util/streams/Sink.java src/share/classes/java/util/streams/ops/MapSortedOp.java src/share/classes/java/util/streams/ops/SortedOp.java |
diffstat | 3 files changed, 26 insertions(+), 48 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/java/util/streams/Sink.java Fri Sep 21 16:24:40 2012 -0700 +++ b/src/share/classes/java/util/streams/Sink.java Fri Sep 21 16:30:57 2012 -0700 @@ -115,4 +115,24 @@ downstream.end(); } } + + public static class ChainedMapAdapter<K, V> extends ChainedMap<K, V> { + public ChainedMapAdapter(ChainedValue<? extends Mapping<K, V>> downstream) { + super(downstream); + } + + @Override + public void accept(Mapping<K, V> e) { + downstream.accept(e); + } + + @Override + public void accept(K k, V v) { + downstream.accept(new Mapping.MappingValue<>(k, v)); + } + + public static <K, V> ChainedMap adapt(ChainedValue<? extends Mapping<K, V>> sink) { + return new ChainedMapAdapter<K, V>(sink); + } + } }
--- a/src/share/classes/java/util/streams/ops/MapSortedOp.java Fri Sep 21 16:24:40 2012 -0700 +++ b/src/share/classes/java/util/streams/ops/MapSortedOp.java Fri Sep 21 16:30:57 2012 -0700 @@ -37,15 +37,10 @@ * @param <V> Values associated with keys to be sorted * */ -public class MapSortedOp<K extends Comparable<? super K>,V> implements StatefulOp<Mapping<K,V>, Mapping<K,V>> { +public class MapSortedOp<K extends Comparable<? super K>, V> extends SortedOp<Mapping<K, V>> { private static final int DEFAULT_PRIORITY_QUEUE_SIZE = 16; /** - * Comparator used for sorting. - */ - private final Comparator<? super Mapping<K,V>> comparator; - - /** * Sort using natural order of {@literal <K>} which must be * {@code Comparable}. */ @@ -60,56 +55,19 @@ * @param comparator The comparator to be used to evaluate ordering. */ public MapSortedOp(Comparator<? super Mapping<K,V>> comparator) { - this.comparator = Objects.requireNonNull(comparator); - } - - @Override - public int getStreamFlags(int upstreamFlags) { - return upstreamFlags | Stream.FLAG_SORTED; + super(Objects.requireNonNull(comparator)); } @Override public Sink<Mapping<K, V>, K, V> wrapSink(Sink sink) { - return new Sink.ChainedMap<K, V>(sink) { - PriorityQueue<Mapping<K,V>> pq; - @Override - public void begin(int size) { - pq = new PriorityQueue<>(size > 0 ? size : DEFAULT_PRIORITY_QUEUE_SIZE, comparator); - } - - @Override - public void end() { - while (!pq.isEmpty()) { - downstream.accept(pq.remove()); - } - } - - @Override - public void accept(K k, V v) { - // @@@ Do something here! - } - - @Override - public void accept(Mapping<K,V> m) { - pq.add(m); - } - }; + return new Sink.ChainedMapAdapter<K, V>( + (Sink.ChainedValue<Mapping<K, V>>) super.wrapSink(sink)); } @Override public MapIterator<K,V> wrapIterator(Iterator<Mapping<K, V>> iterator) { Objects.requireNonNull(iterator); - return iterator(iterator, comparator); - } - - private static <K,V> MapIterator<K,V> iterator(Iterator<Mapping<K, V>> iterator, Comparator<? super Mapping<K,V>> comparator) { - Objects.requireNonNull(iterator); - Objects.requireNonNull(comparator); - final PriorityQueue<Mapping<K,V>> pq = new PriorityQueue<>(DEFAULT_PRIORITY_QUEUE_SIZE, comparator); - while (iterator.hasNext()) { - pq.add(iterator.next()); - } - return MapIterator.IteratorAdapter.adapt(pq.iterator()); + return MapIterator.IteratorAdapter.adapt(super.wrapIterator(iterator)); } @Override
--- a/src/share/classes/java/util/streams/ops/SortedOp.java Fri Sep 21 16:24:40 2012 -0700 +++ b/src/share/classes/java/util/streams/ops/SortedOp.java Fri Sep 21 16:30:57 2012 -0700 @@ -36,7 +36,7 @@ * * @author Brian Goetz */ -public class SortedOp<T> implements StatefulOp<T,T> { +public class SortedOp<T> implements StatefulOp<T, T> { private static final int DEFAULT_PRIORITY_QUEUE_SIZE = 16; /**