Cevap, her zaman olduğu gibi "duruma bağlıdır" dır. Geri gönderilen koleksiyonun ne kadar büyük olacağına bağlıdır. Sonucun zaman içinde değişip değişmediğine ve döndürülen sonucun tutarlılığının ne kadar önemli olduğuna bağlıdır. Ve bu, kullanıcının yanıtı nasıl kullanacağına çok bağlıdır.
İlk olarak, bir Akıştan her zaman bir Koleksiyon alabileceğinizi veya bunun tersini yapabileceğinizi unutmayın:
// If API returns Collection, convert with stream()
getFoo().stream()...
// If API returns Stream, use collect()
Collection<T> c = getFooStream().collect(toList());
Yani soru şu ki arayanlar için daha faydalı.
Sonucunuz sonsuz olabilirse, tek bir seçenek vardır: Akış.
Sonucunuz çok büyükse, muhtemelen Stream'i tercih edersiniz, çünkü hepsini bir kerede gerçekleştirmede herhangi bir değer olmayabilir ve bunu yapmak önemli yığın basıncı yaratabilir.
Arayanın tüm yapacağı tekrarı yinelemekse (arama, filtreleme, toplama), Akış önceden seçilmeli ve bir koleksiyon gerçekleştirmeye gerek olmadığından (özellikle kullanıcı, bütün sonuç.) Bu çok yaygın bir durumdur.
Kullanıcının birden çok kez yineleyeceğini veya başka bir şekilde saklayacağını biliyor olsanız bile, bunun yerine bir Akış döndürmek isteyebilirsiniz, çünkü onu yerleştirmeyi seçtiğiniz Koleksiyonun (ör. ArrayList) istediklerinde ve arayanın yine de kopyalaması gerekir. bir akış döndürürseniz yapabilir collect(toCollection(factory))
ve tam olarak istedikleri biçimde alabilirler.
Yukarıdaki "Stream'i Tercih Et" vakaları çoğunlukla Stream'in daha esnek olduğu gerçeğinden kaynaklanır; bir Koleksiyona materyalize etmenin maliyetlerini ve kısıtlamalarını ödemeden onu nasıl kullandığınıza geç bağlayabilirsiniz.
Bir Koleksiyonu iade etmeniz gereken tek durum, güçlü tutarlılık gereksinimleri olduğunda ve hareketli bir hedefin tutarlı bir anlık görüntüsünü oluşturmanız gerektiğidir. Ardından, öğeleri değişmeyecek bir koleksiyona koymak isteyeceksiniz.
Bu nedenle, çoğu zaman Stream'in doğru cevap olduğunu söyleyebilirim - daha esnektir, genellikle gereksiz materyalizasyon maliyetleri getirmez ve gerekirse kolayca seçtiğiniz Koleksiyona dönüştürülebilir. Ancak bazen, bir Koleksiyonu iade etmeniz gerekebilir (örneğin, güçlü tutarlılık gereksinimleri nedeniyle) veya Koleksiyonu iade etmek isteyebilirsiniz, çünkü kullanıcının onu nasıl kullanacağını bilirsiniz ve bunun onlar için en uygun şey olduğunu bilirsiniz.
players.stream()
, arayana bir akış döndüren böyle bir yöntemdir. Asıl soru şu ki, gerçekten arayanı tek geçişle sınırlamak ve ayrıcaCollection
API üzerinden koleksiyonunuza erişimini reddetmek istiyor musunuz? Belki arayan sadeceaddAll
başka bir koleksiyona istiyor ?