View Javadoc
1   package org.davidmoten.kool.internal.operators.stream;
2   
3   import org.davidmoten.kool.Stream;
4   import org.davidmoten.kool.StreamIterator;
5   import org.davidmoten.kool.internal.util.EvictingQueue;
6   
7   public final class TakeLast<T> implements Stream<T> {
8   
9       private final Stream<T> stream;
10      private final long n;
11  
12      public TakeLast(Stream<T> stream, long n) {
13          this.stream = stream;
14          this.n = n;
15      }
16  
17      @Override
18      public StreamIterator<T> iterator() {
19          return new StreamIterator<T>() {
20  
21              StreamIterator<T> it = stream.iteratorNullChecked();
22              EvictingQueue<T> queue = new EvictingQueue<T>(n);
23              
24              @Override
25              public boolean hasNext() {
26                  load();
27                  return queue.hasMoreElements();
28              }
29  
30              @Override
31              public T next() {
32                  load();
33                  return queue.nextElement();
34              }
35  
36              @Override
37              public void dispose() {
38                  if (it != null) {
39                      it.dispose();
40                      it = null;
41                      queue = null;
42                  }
43              }
44              
45              private void load() {
46                  if (it != null) {
47                      while (it.hasNext()) {
48                          queue.add(it.nextNullChecked());
49                      }
50                      it = null;
51                  }
52              }
53              
54          };
55      }
56  
57  }