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 }