Şu satırı dahil ederiz
import com.hazelcast.jet.Traversers;
Bu sınıf Traverser arayüzünü gerçekleştiren static factory metodlar sunar. Traverser arayüzü bir @FunctionalInterface O yüzden çoğu gerçekleştirim sadece lambda ile yapılabilir.
stream metodu
Kod şöyle
public static <T> Traverser<T> traverseStream(@Nonnull Stream<T> stream) { return traverseSpliterator(stream.spliterator()).onFirstNull(stream::close); }
Stream nesnesini Spliterator nesnesi çevirir ve dolaşır. Altta kullanılan kod şöyle. Burada next() metodu Spliterator nesnesi tryAdvance() ile ilerlemişse sonraki nesneyi döner ve sonraki nesneyi finally block içinde tekrar null yapar. Böylece tryAdvance() false dönerse null döner ve stream::close da çalışır.
private static class SpliteratorTraverser<T> implements Traverser<T>, Consumer<T> { private final Spliterator<T> spliterator; private T nextItem; SpliteratorTraverser(Spliterator<T> spliterator) { this.spliterator = spliterator; } @Override public T next() { try { boolean advanced = spliterator.tryAdvance(this); if (advanced) { requireNonNull(nextItem); } return nextItem; } finally { nextItem = null; // Burada nesneyi null yap } } @Override public void accept(T t) { nextItem = t; } }
traverseIterable metodu
İmzası şöyle
public static <T> Traverser<T> traverseIterable(Iterable<? extends T> iterable)
Hiç yorum yok:
Yorum Gönder