[groovy] branch GROOVY-8258 updated: GROOVY-8258: Reuse the stream as possible as we could

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[groovy] branch GROOVY-8258 updated: GROOVY-8258: Reuse the stream as possible as we could

Daniel.Sun
This is an automated email from the ASF dual-hosted git repository.

sunlan pushed a commit to branch GROOVY-8258
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/GROOVY-8258 by this push:
     new 008a8cb  GROOVY-8258: Reuse the stream as possible as we could
008a8cb is described below

commit 008a8cb85f624e6693d7ad85df7b1d4acc8a8ef7
Author: Daniel Sun <[hidden email]>
AuthorDate: Sun Oct 18 17:33:48 2020 +0800

    GROOVY-8258: Reuse the stream as possible as we could
---
 .../linq/provider/collection/QueryableCollection.java       | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/subprojects/groovy-linq/src/main/groovy/org/apache/groovy/linq/provider/collection/QueryableCollection.java b/subprojects/groovy-linq/src/main/groovy/org/apache/groovy/linq/provider/collection/QueryableCollection.java
index 476c0d3..b2a3a5c 100644
--- a/subprojects/groovy-linq/src/main/groovy/org/apache/groovy/linq/provider/collection/QueryableCollection.java
+++ b/subprojects/groovy-linq/src/main/groovy/org/apache/groovy/linq/provider/collection/QueryableCollection.java
@@ -45,6 +45,7 @@ import static org.apache.groovy.linq.provider.collection.Queryable.from;
 @Internal
 class QueryableCollection<T> implements Queryable<T>, Iterable<T> {
     private final Iterable<T> sourceIterable;
+    private Stream<T> sourceStream;
 
     QueryableCollection(Iterable<T> sourceIterable) {
         if (sourceIterable instanceof QueryableCollection) {
@@ -199,7 +200,17 @@ class QueryableCollection<T> implements Queryable<T>, Iterable<T> {
 
     @Override
     public Stream<T> stream() {
-        return toStream(sourceIterable);  // we have to create new stream every time because Java stream can not be reused
+        if (null != sourceStream) {
+            try {
+                sourceStream.peek(e -> {}); // check if the stream is usable
+                return sourceStream;
+            } catch (IllegalStateException ignore) {
+            }
+        }
+
+        sourceStream = toStream(sourceIterable);
+
+        return sourceStream;  // we have to create new stream every time because Java stream can not be reused
     }
 
     @Override

Apache Groovy committer & PMC member

Blog: http://blog.sunlan.me
Twitter: @daniel_sun