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

  • CodingMadeEasy

    CodingMadeEa

    25 EYLÜL 2010
  • PlayStation

    PlayStation

    16 Aralık 2005
  • ThePhestor

    ThePhestor

    22 Mart 2011