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

  • Dumb Stupid Videos

    Dumb Stupid

    26 Kasım 2013
  • Kyletiv7

    Kyletiv7

    28 Mayıs 2007
  • ParryGripp

    ParryGripp

    12 AĞUSTOS 2006