OpenJDK / lambda / lambda / jdk
changeset 5979:250842824019 it2-bootstrap
More enforcement of input/output shape matchup; correctly specify input/output shapes for more ops; rework MapIterator implementations to avoid boxing
line wrap: on
line diff
--- a/src/share/classes/java/util/Mapping.java Wed Sep 05 14:23:46 2012 -0700 +++ b/src/share/classes/java/util/Mapping.java Wed Sep 05 17:57:29 2012 -0400 @@ -94,4 +94,24 @@ return Objects.hashCode(getKey()) ^ Objects.hashCode(getValue()); } } + + public static class MappingValue<K, V> extends AbstractMapping<K, V> { + private final K k; + private final V v; + + public MappingValue(K k, V v) { + this.k = k; + this.v = v; + } + + @Override + public K getKey() { + return k; + } + + @Override + public V getValue() { + return v; + } + } }
--- a/src/share/classes/java/util/streams/AbstractPipeline.java Wed Sep 05 14:23:46 2012 -0700 +++ b/src/share/classes/java/util/streams/AbstractPipeline.java Wed Sep 05 17:57:29 2012 -0400 @@ -221,4 +221,9 @@ public Stream.Shape getInputShape() { return source.getShape(); } + + public<V> V pipeline(TerminalOp<U, V> terminal) { + assert getShape() == terminal.inputShape(); + return evaluate(terminal); + } }
--- a/src/share/classes/java/util/streams/LinearPipeline.java Wed Sep 05 14:23:46 2012 -0700 +++ b/src/share/classes/java/util/streams/LinearPipeline.java Wed Sep 05 17:57:29 2012 -0400 @@ -55,10 +55,6 @@ return new LinearPipeline<>(this, op); } - public<V> V pipeline(TerminalOp<U, V> op) { - return evaluate(op); - } - @Override public Stream<U> filter(Predicate<? super U> predicate) { return chainLinear(new FilterOp<>(predicate));
--- a/src/share/classes/java/util/streams/MapPipeline.java Wed Sep 05 14:23:46 2012 -0700 +++ b/src/share/classes/java/util/streams/MapPipeline.java Wed Sep 05 17:57:29 2012 -0400 @@ -83,10 +83,6 @@ return chainMap(new BiTeeOp<>(block)); } - public<U> U pipeline(TerminalOp<Mapping<K,V>, U> op) { - return evaluate(op); - } - @Override public Stream<K> keys() { return chainLinear(new MapExtractKeysOp<K,V>());
--- a/src/share/classes/java/util/streams/ops/BiAllMatchOp.java Wed Sep 05 14:23:46 2012 -0700 +++ b/src/share/classes/java/util/streams/ops/BiAllMatchOp.java Wed Sep 05 17:57:29 2012 -0400 @@ -29,6 +29,7 @@ import java.util.Mapping; import java.util.Objects; import java.util.functions.BiPredicate; +import java.util.streams.Stream; /** * BiAllMatchOp @@ -50,6 +51,11 @@ return allMatch(new MapIterator.IteratorAdapter<>(iterator), predicate); } + @Override + public Stream.Shape inputShape() { + return Stream.Shape.KEY_VALUE; + } + public static <K,V> boolean allMatch(MapIterator<K,V> iterator, BiPredicate<? super K, ? super V> predicate) { while (iterator.hasNext()) { if(!predicate.test(iterator.nextKey(), iterator.curValue())) {
--- a/src/share/classes/java/util/streams/ops/BiAnyMatchOp.java Wed Sep 05 14:23:46 2012 -0700 +++ b/src/share/classes/java/util/streams/ops/BiAnyMatchOp.java Wed Sep 05 17:57:29 2012 -0400 @@ -29,6 +29,7 @@ import java.util.Mapping; import java.util.Objects; import java.util.functions.BiPredicate; +import java.util.streams.Stream; /** * BiAnyMatchOp @@ -50,6 +51,11 @@ return anyMatch(new MapIterator.IteratorAdapter<>(iterator), predicate); } + @Override + public Stream.Shape inputShape() { + return Stream.Shape.KEY_VALUE; + } + public static <K,V> boolean anyMatch(MapIterator<K,V> iterator, BiPredicate<? super K, ? super V> predicate) { while (iterator.hasNext()) { if(predicate.test(iterator.nextKey(), iterator.curValue())) {
--- a/src/share/classes/java/util/streams/ops/BiMapOp.java Wed Sep 05 14:23:46 2012 -0700 +++ b/src/share/classes/java/util/streams/ops/BiMapOp.java Wed Sep 05 17:57:29 2012 -0400 @@ -56,11 +56,7 @@ } @Override - public Iterator<Mapping<K, U>> iterator(final Iterator<Mapping<K,V>> source) { - return iterator(source, mapper); - } - - public MapIterator<K, U> iterator(final MapIterator<K,V> source) { + public MapIterator<K,U> iterator(final Iterator<Mapping<K,V>> source) { return iterator(source, mapper); } @@ -78,51 +74,54 @@ final BiMapper<? super K, ? super V, ? extends VV> mapper) { Objects.requireNonNull(source); Objects.requireNonNull(mapper); + final MapIterator<K,V> asMI = (MapIterator<K, V>) source; return new MapIterator<K, VV>() { Mapping<K, VV> current; @Override public boolean hasNext() { - return source.hasNext(); + return asMI.hasNext(); } @Override public Mapping<K, VV> next() { - final Mapping<K, V> next = source.next(); - current = new Mapping.AbstractMapping<K,VV>() { - @Override - public K getKey() { - return next.getKey(); - } - - @Override - public VV getValue() { - return mapper.map(next.getKey(), next.getValue()); - } - }; - + K k = asMI.nextKey(); + V v = asMI.curValue(); + current = new Mapping.MappingValue<>(k, mapper.map(k, v)); return current; } @Override public K nextKey() { - return next().getKey(); + return asMI.nextKey(); } @Override public VV nextValue() { - return next().getValue(); + K k = asMI.nextKey(); + V v = asMI.curValue(); + return mapper.map(k, v); } @Override public K curKey() { - return current.getKey(); + return asMI.curKey(); } @Override public VV curValue() { - return current.getValue(); + return mapper.map(asMI.curKey(), asMI.curValue()); } }; } + + @Override + public Stream.Shape outputShape() { + return Stream.Shape.KEY_VALUE; + } + + @Override + public Stream.Shape inputShape() { + return Stream.Shape.KEY_VALUE; + } }
--- a/src/share/classes/java/util/streams/ops/BiTeeOp.java Wed Sep 05 14:23:46 2012 -0700 +++ b/src/share/classes/java/util/streams/ops/BiTeeOp.java Wed Sep 05 17:57:29 2012 -0400 @@ -56,11 +56,7 @@ } @Override - public Iterator<Mapping<K, V>> iterator(final Iterator<Mapping<K,V>> source) { - return iterator(source, tee); - } - - public MapIterator<K, V> iterator(final MapIterator<K,V> source) { + public MapIterator<K, V> iterator(final Iterator<Mapping<K,V>> source) { return iterator(source, tee); } @@ -79,42 +75,55 @@ final BiBlock<? super K, ? super V> tee) { Objects.requireNonNull(source); Objects.requireNonNull(tee); + final MapIterator<K, V> asMI = (MapIterator<K, V>) source; return new MapIterator<K, V>() { - Mapping<K, V> current; - @Override public boolean hasNext() { - return source.hasNext(); + return asMI.hasNext(); } @Override public Mapping<K, V> next() { - current = source.next(); - + Mapping<K, V> current = source.next(); tee.apply(current.getKey(), current.getValue()); - return current; } @Override public K nextKey() { - return next().getKey(); + K k = asMI.nextKey(); + V v = asMI.curValue(); + tee.apply(k, v); + return k; } @Override public V nextValue() { - return next().getValue(); + K k = asMI.nextKey(); + V v = asMI.curValue(); + tee.apply(k, v); + return v; } @Override public K curKey() { - return current.getKey(); + return asMI.curKey(); } @Override public V curValue() { - return current.getValue(); + return asMI.curValue(); } }; } + + @Override + public Stream.Shape inputShape() { + return Stream.Shape.KEY_VALUE; + } + + @Override + public Stream.Shape outputShape() { + return Stream.Shape.KEY_VALUE; + } }
--- a/src/share/classes/java/util/streams/ops/ForEachOp.java Wed Sep 05 14:23:46 2012 -0700 +++ b/src/share/classes/java/util/streams/ops/ForEachOp.java Wed Sep 05 17:57:29 2012 -0400 @@ -31,6 +31,7 @@ import java.util.functions.BiBlock; import java.util.functions.Block; import java.util.streams.Sink; +import java.util.streams.Stream; import java.util.streams.TerminalSink; /** @@ -40,8 +41,10 @@ */ public class ForEachOp<T> implements TerminalOp<T,Void> { private final TerminalSink<T,Void> sink; + private final Stream.Shape shape; - protected ForEachOp(TerminalSink<T, Void> sink) { + protected ForEachOp(TerminalSink<T, Void> sink, Stream.Shape shape) { + this.shape = shape; this.sink = Objects.requireNonNull(sink); } @@ -56,7 +59,7 @@ public Void getAndClearState() { return null; } - }); + }, Stream.Shape.LINEAR); } public static<K,V> ForEachOp<Mapping<K,V>> make(final BiBlock<? super K, ? super V> block) { @@ -76,7 +79,7 @@ public Void getAndClearState() { return null; } - }); + }, Stream.Shape.KEY_VALUE); } @Override @@ -85,6 +88,11 @@ } @Override + public Stream.Shape inputShape() { + return shape; + } + + @Override public <V> Void computeParallel(ParallelOpHelper<T, V> helper) { int depth = helper.suggestDepth(); Sink<V, ?, ?> compoundSink = helper.sink(sink);
--- a/src/share/classes/java/util/streams/ops/MapExtractKeysOp.java Wed Sep 05 14:23:46 2012 -0700 +++ b/src/share/classes/java/util/streams/ops/MapExtractKeysOp.java Wed Sep 05 17:57:29 2012 -0400 @@ -66,4 +66,9 @@ } }; } + + @Override + public Stream.Shape inputShape() { + return Stream.Shape.KEY_VALUE; + } }
--- a/src/share/classes/java/util/streams/ops/MapExtractValuesOp.java Wed Sep 05 14:23:46 2012 -0700 +++ b/src/share/classes/java/util/streams/ops/MapExtractValuesOp.java Wed Sep 05 17:57:29 2012 -0400 @@ -66,4 +66,9 @@ } }; } + + @Override + public Stream.Shape inputShape() { + return Stream.Shape.KEY_VALUE; + } }
--- a/src/share/classes/java/util/streams/ops/MapFilterKeysOp.java Wed Sep 05 14:23:46 2012 -0700 +++ b/src/share/classes/java/util/streams/ops/MapFilterKeysOp.java Wed Sep 05 17:57:29 2012 -0400 @@ -25,6 +25,7 @@ package java.util.streams.ops; import java.util.Iterator; +import java.util.MapIterator; import java.util.Mapping; import java.util.Objects; import java.util.functions.Predicate; @@ -49,7 +50,7 @@ } @Override - public Iterator<Mapping<K, V>> iterator(Iterator<Mapping<K, V>> in) { + public MapIterator<K,V> iterator(Iterator<Mapping<K, V>> in) { throw new UnsupportedOperationException("nyi"); } @@ -64,4 +65,14 @@ } }; } + + @Override + public Stream.Shape inputShape() { + return Stream.Shape.KEY_VALUE; + } + + @Override + public Stream.Shape outputShape() { + return Stream.Shape.KEY_VALUE; + } }
--- a/src/share/classes/java/util/streams/ops/MapFilterValuesOp.java Wed Sep 05 14:23:46 2012 -0700 +++ b/src/share/classes/java/util/streams/ops/MapFilterValuesOp.java Wed Sep 05 17:57:29 2012 -0400 @@ -25,6 +25,7 @@ package java.util.streams.ops; import java.util.Iterator; +import java.util.MapIterator; import java.util.Mapping; import java.util.Objects; import java.util.functions.Predicate; @@ -49,7 +50,7 @@ } @Override - public Iterator<Mapping<K, V>> iterator(Iterator<Mapping<K, V>> in) { + public MapIterator<K,V> iterator(Iterator<Mapping<K, V>> in) { throw new UnsupportedOperationException("nyi"); } @@ -64,4 +65,14 @@ } }; } + + @Override + public Stream.Shape inputShape() { + return Stream.Shape.KEY_VALUE; + } + + @Override + public Stream.Shape outputShape() { + return Stream.Shape.KEY_VALUE; + } }
--- a/src/share/classes/java/util/streams/ops/MapMapValuesOp.java Wed Sep 05 14:23:46 2012 -0700 +++ b/src/share/classes/java/util/streams/ops/MapMapValuesOp.java Wed Sep 05 17:57:29 2012 -0400 @@ -25,6 +25,7 @@ package java.util.streams.ops; import java.util.Iterator; +import java.util.MapIterator; import java.util.Mapping; import java.util.Objects; import java.util.functions.Mapper; @@ -53,7 +54,7 @@ } @Override - public Iterator<Mapping<K, U>> iterator(Iterator<Mapping<K, V>> in) { + public MapIterator<K, U> iterator(Iterator<Mapping<K, V>> in) { throw new UnsupportedOperationException("nyi"); } @@ -66,4 +67,15 @@ } }; } + + @Override + public Stream.Shape inputShape() { + return Stream.Shape.KEY_VALUE; + } + + @Override + public Stream.Shape outputShape() { + return Stream.Shape.KEY_VALUE; + } + }
--- a/src/share/classes/java/util/streams/ops/MapSortedOp.java Wed Sep 05 14:23:46 2012 -0700 +++ b/src/share/classes/java/util/streams/ops/MapSortedOp.java Wed Sep 05 17:57:29 2012 -0400 @@ -110,4 +110,14 @@ } return new MapIterator.IteratorAdapter<>(pq.iterator()); } + + @Override + public Stream.Shape inputShape() { + return Stream.Shape.KEY_VALUE; + } + + @Override + public Stream.Shape outputShape() { + return Stream.Shape.KEY_VALUE; + } }
--- a/src/share/classes/java/util/streams/ops/MapSwapOp.java Wed Sep 05 14:23:46 2012 -0700 +++ b/src/share/classes/java/util/streams/ops/MapSwapOp.java Wed Sep 05 17:57:29 2012 -0400 @@ -25,6 +25,7 @@ package java.util.streams.ops; import java.util.Iterator; +import java.util.MapIterator; import java.util.Mapping; import java.util.streams.Sink; import java.util.streams.Stream; @@ -51,27 +52,39 @@ } @Override - public Iterator<Mapping<V, K>> iterator(final Iterator<Mapping<K, V>> in) { - return new Iterator<Mapping<V, K>>() { + public MapIterator<V, K> iterator(final Iterator<Mapping<K, V>> in) { + final MapIterator<K,V> asMI = (MapIterator<K, V>) in; + return new MapIterator<V, K>() { @Override public boolean hasNext() { - return in.hasNext(); + return asMI.hasNext(); + } + + @Override + public V nextKey() { + return asMI.nextValue(); + } + + @Override + public K nextValue() { + return asMI.nextKey(); + } + + @Override + public V curKey() { + return asMI.curValue(); + } + + @Override + public K curValue() { + return asMI.curKey(); } @Override public Mapping<V, K> next() { - final Mapping<K, V> swap = in.next(); - return new Mapping.AbstractMapping<V, K>() { - @Override - public V getKey() { - return swap.getValue(); - } - - @Override - public K getValue() { - return swap.getKey(); - } - }; + K k = asMI.nextKey(); + V v = asMI.curValue(); + return new Mapping.MappingValue<>(v, k); } }; } @@ -85,4 +98,14 @@ } }; } + + @Override + public Stream.Shape inputShape() { + return Stream.Shape.KEY_VALUE; + } + + @Override + public Stream.Shape outputShape() { + return Stream.Shape.KEY_VALUE; + } }
--- a/src/share/classes/java/util/streams/ops/MappedOp.java Wed Sep 05 14:23:46 2012 -0700 +++ b/src/share/classes/java/util/streams/ops/MappedOp.java Wed Sep 05 17:57:29 2012 -0400 @@ -97,17 +97,7 @@ @Override public Mapping<T, R> next() { advance(); - return new Mapping.AbstractMapping<T,R>() { - @Override - public T getKey() { - return currentKey; - } - - @Override - public R getValue() { - return currentValue; - } - }; + return new Mapping.MappingValue<>(currentKey, currentValue); } }; } @@ -121,4 +111,9 @@ } }; } + + @Override + public Stream.Shape outputShape() { + return Stream.Shape.KEY_VALUE; + } }
--- a/src/share/classes/java/util/streams/ops/SeedlessFoldOp.java Wed Sep 05 14:23:46 2012 -0700 +++ b/src/share/classes/java/util/streams/ops/SeedlessFoldOp.java Wed Sep 05 17:57:29 2012 -0400 @@ -24,6 +24,7 @@ */ package java.util.streams.ops; +import java.util.Iterator; import java.util.Objects; import java.util.Optional; import java.util.functions.BinaryOperator; @@ -57,6 +58,18 @@ } @Override + public Optional<T> evaluate(Iterator<T> iterator) { + if (!iterator.hasNext()) + return Optional.empty(); + else { + T result = iterator.next(); + while (iterator.hasNext()) + result = operator.combine(result, iterator.next()); + return new Optional<>(result); + } + } + + @Override public TerminalSink<T, Optional<T>> sink() { return new TerminalSink<T, Optional<T>>() { private boolean first = true;
--- a/src/share/classes/java/util/streams/ops/TerminalOp.java Wed Sep 05 14:23:46 2012 -0700 +++ b/src/share/classes/java/util/streams/ops/TerminalOp.java Wed Sep 05 17:57:29 2012 -0400 @@ -25,6 +25,7 @@ package java.util.streams.ops; import java.util.Iterator; +import java.util.streams.Stream; import java.util.streams.TerminalSink; /** @@ -60,4 +61,6 @@ helper.spliterator().into(helper.sink(toArraySink)); return toArraySink.getAndClearState(); } + + Stream.Shape inputShape() default { return Stream.Shape.LINEAR; } }