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 }