Skip to content

Commit 195d207

Browse files
committed
Create spliterator on the fly by copying cursor to Map.Entry
1 parent 7023f6c commit 195d207

File tree

1 file changed

+16
-5
lines changed

1 file changed

+16
-5
lines changed

server/src/main/java/org/elasticsearch/common/collect/ImmutableOpenMap.java

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,11 @@
2323
import java.util.Iterator;
2424
import java.util.Map;
2525
import java.util.Objects;
26+
import java.util.Spliterator;
27+
import java.util.Spliterators;
28+
import java.util.function.Consumer;
2629
import java.util.stream.Stream;
30+
import java.util.stream.StreamSupport;
2731

2832
/**
2933
* An immutable map implementation based on open hash map.
@@ -170,11 +174,18 @@ public void remove() {
170174
* @return a {@link Stream} of the map entries as {@link Entry}
171175
*/
172176
public Stream<Entry<KType, VType>> stream() {
173-
Stream.Builder<Entry<KType, VType>> streamBuilder = Stream.builder();
174-
for (ObjectObjectCursor<KType, VType> cursor : map) {
175-
streamBuilder.add(new Entry<>(cursor.key, cursor.value));
176-
}
177-
return streamBuilder.build();
177+
Iterator<ObjectObjectCursor<KType, VType>> mapIterator = map.iterator();
178+
return StreamSupport.stream(new Spliterators.AbstractSpliterator<>(map.size(), Spliterator.SIZED) {
179+
@Override
180+
public boolean tryAdvance(Consumer<? super Entry<KType, VType>> action) {
181+
if (mapIterator.hasNext() == false) {
182+
return false;
183+
}
184+
ObjectObjectCursor<KType, VType> cursor = mapIterator.next();
185+
action.accept(new Entry<>(cursor.key, cursor.value));
186+
return true;
187+
}
188+
}, false);
178189
}
179190

180191
@Override

0 commit comments

Comments
 (0)