Java 8: Tembel işlemler için Akışlarda API'ları iletmek için iyi bir uygulama var mı?


12

Guava gibi önceden Java 8 lambda-ağır kütüphanelerinde, çıkışlar bu yüzden kütüphane yöntemi keserse (örneğin tembel hala koşum bazı tembel hesaplama dış / iç API'lere hç ve kolaydır ortak Java Koleksiyon Çerçeve arayüzleri kullanın filter()ve transform()).

Ancak, Java 8 Akarsu, çağrı bir olsun Collection/ Mapterminal (yani hevesli) ve aynı zamanda sonuçlarını tutmak için yeni veri yapılarını ayıracak.

Ortada çok aşamalı ve strateji paternli karmaşık hesaplamalar için, bu, ara sonuçlardan dolayı çok fazla gereksiz tahsise neden olur.

Yani, insanlar iç API'lerin (yani strateji desen stratejilerinin) alması ve geri dönmesi için iyi bir uygulama olduğunu düşünüyor mu yoksa Streamtembel ama aerodinamik olmayan (sanırım pun) Guava API'larına geri dönmeli miyim?

Düzenle:

Benim asıl endişem Stream, sadece bir kez tüketilebilmesi ve Supplier<Stream<X>>son derece hantal bir görünüm gibi bir şey geçirebilmesidir . Neredeyse bir Collectionve daha sonra stream()onu geçmeye itiyor (ve bu noktada istekli değerlendirme maliyetini ödüyor).


Ne, Guava ve arkadaşları yerel akışlardan yararlanmak için güncellenmiyor mu?
Kilian Foth

1
Akışları alıp geri getiren arabirimlere sahip olmak, standart akış işlevleriyle birlikte çalışabilirliği gerçekten geliştirir. Arayüzünüze yapılan aramaları bir akış hattına entegre etmenizi sağlar.
Philipp

@KilianFoth Neredeyse bir yıldır Guava sürümü yayınlanmadı ve Guava'nın lambda eşyalarını Stream ile değiştirmekle ilgili birçok popüler makale var; ancak hiçbiri Guava toplama operasyonlarının hevesli veya tembel olabileceği gerçeğine değinmiyor.
billc.cn

Yanıtlar:


3

Java 8 Streams'teki tembellik, Guava'daki Iterables için eskisi gibi çalışır: tembel kalmak için Yinelenebilir'i geçmeniz gerekir ve değerlendirme, Yineleyiciden bir Koleksiyon oluşturduğunuzda gerçekleşir. Hem Akışlar hem de Yineleyiciler yalnızca bir kez tüketilebilir.

Bu nedenle yöntem arayüzleriniz için daha genel yol (tembelliğe izin vermek) Akış arayüzünü kullanmaktır (daha önce Yinelenebilir'i her kullanışınızda). @Philipp'in dediği gibi, bu onların Akış boru hatlarında kullanılmasına izin verir.

İnşallah, Stream artık resmi bir Java standart arayüzü olduğundan, doğrudan Akışlar üzerinde verimli bir şekilde çalışabilen daha fazla kitaplık ve işlev olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.