Java8 Akışı Yineleyici | Netgez.com
SORU
1 Temmuz 2014, Salı


Java8 Akışı Yineleyici

Kısa ve öz bir şekilde Stream veya daha fazla Iterator özellikle "stream." iterator görünümüne dönüştürmek için arıyorum

Performans için bir sebep, yeni bir liste yineleyici bir kopyasını önlemek için istiyorum:

Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator();
Collection<String> copyList = new ArrayList<String>();
sourceIterator.forEachRemaining(copyList::add);
Stream<String> targetStream = copyList.stream();

Yorumlarda bazı önerileri temelinde, da Stream.generate denedim:

public static void main(String[] args) throws Exception {
    Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator();
    Stream<String> targetStream = Stream.generate(sourceIterator::next);
    targetStream.forEach(System.out::println);
}

ama NoSuchElementException hasNext çağırma yok (beri)

Exception in thread "main" java.util.NoSuchElementException
    at java.util.AbstractList$Itr.next(AbstractList.java:364)
    at Main$$Lambda$1/1175962212.get(Unknown Source)
    at java.util.stream.StreamSpliterators$InfiniteSupplyingSpliterator$OfRef.tryAdvance(StreamSpliterators.java:1351)
    at java.util.Spliterator.forEachRemaining(Spliterator.java:326)
    at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
    at Main.main(Main.java:20)

StreamSupport Collections baktım ama bir şey bulamadım.

CEVAP
1 Temmuz 2014, Salı


Tek yönlü Yineleyici bir Spliterator oluşturmak ve stream için bir temel olarak kullanmak

Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator();
Stream<String> targetStream = StreamSupport.stream(
          Spliterators.spliteratorUnknownSize(sourceIterator, Spliterator.ORDERED),
          false);

Belki daha okunaklı bir alternatif bir İterable kullanmak ve bir Yineleyici bir İterable oluşturma İterable işlevsel bir arayüzü olduğu için Lambda ile çok kolay

Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator();

Iterable<String> iterable = () -> sourceIterator;
Stream<String> targetStream = StreamSupport.stream(iterable.spliterator(), false);

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ★ByScrapi★ Designs

    ★ByScrapiâ

    27 AÄžUSTOS 2013
  • Chriselle Lim

    Chriselle Li

    26 Ocak 2008
  • LatinNinja99

    LatinNinja99

    28 EKİM 2011