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

  • 30GB

    30GB

    14 AĞUSTOS 2006
  • grickle

    grickle

    22 AĞUSTOS 2006
  • William Hyde

    William Hyde

    23 HAZİRAN 2008