SORU
23 Aralık 2013, PAZARTESİ


Bir yüklem tarafından bir dere sınırı

Bir (potansiyel olarak) sonsuz sınırları Java 8 akış işlemi Stream bir yüklem maç için başarısız olan ilk öğe kadar var mı? Örnekte (olmayan) takeWhile işlemi aşağıdaki gibi görünüyor ve baskı tüm sayılar 10'dan daha az bir şey mi?

IntStream
    .iterate(1, n -> n   1)
    .takeWhile(n -> n < 10)
    .forEach(System.out::println);

Eğer böyle bir operasyon varsa hayır, genel bir şekilde uygulamak için en iyi yolu nedir?

CEVAP
24 Aralık 2013, Salı


Böyle bir operasyon olmalımümkünörneğin ama mutlaka etkin bir şekilde yapılamaz 8 Stream, Java, sırayla öğeleri bakmak gerekir gibi bir işlem parallelize, yapamazsın.

API gelmez sağlamak kolay bir şekilde yapmak, ama ne muhtemelen en kolay yolu olduğu için Stream.iterator() sarma Iterator bir "al-" uygulama, ve sonra geri dönmek için Spliterator ve sonra Stream. Ya da ... belki ... şal artık bölünmüş olamaz olsa Spliterator, Bu uygulama içinde.

İşte Spliterator takeWhile denenmemiş bir uygulama:

static <T> Spliterator<T> takeWhile(
    Spliterator<T> splitr, Predicate<? super T> predicate) {
  return new Spliterators.AbstractSpliterator<T>(splitr.estimateSize(), 0) {
    boolean stillGoing = true;
    @Override public boolean tryAdvance(Consumer<? super T> consumer) {
      if (stillGoing) {
        boolean hadNext = splitr.tryAdvance(elem -> {
          if (predicate.test(elem)) {
            consumer.accept(elem);
          } else {
            stillGoing = false;
          }
        });
        return hadNext && stillGoing;
      }
      return false;
    }
  };
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bobinire

    bobinire

    24 EYLÜL 2006
  • sWooZie

    sWooZie

    9 ŞUBAT 2006
  • Tianna Sierra Dance

    Tianna Sierr

    16 EYLÜL 2013