SORU
10 Temmuz 2014, PERŞEMBE


Bir Toplama ya da bir Dere mi dönmeliyim?

Salt okunur bir üye listesi görünümü: döndüren bir yöntem var sanırım

class Team
{
    private List<Player> players = new ArrayList<>();

    // ...

    public List<Player> getPlayers()
    {
        return Collections.unmodifiableList(players);
    }
}

Daha fazla istemci tüm liste üzerinde yineleme sonra, hemen olsun. Belki bir Bilgi ya da bir şey içine oyuncular koymak. Müşteri yokdeğildaha sonra muayene için listeye bir referans saklayın!

Bu yaygın bir senaryo göz önüne alındığında, yayın yerine geri getirebilirim?

    public Stream<Player> getPlayers()
    {
        return players.stream();
    }

Veya bir akışı olmayan çevirebilen bir Java dönüyor? Dere her zaman "aynı ifade içinde oluşturulduğu? erdirilecek tasarlanmıştır

CEVAP
10 Temmuz 2014, PERŞEMBE


Cevap, her zaman olduğu gibi "duruma göre". Döndürülen koleksiyonu olacak nasıl bağlıdır. Sonuç zaman içinde bir değişiklik olup olmadığını, ve ne kadar önemli döndürülen sonuç tutarlılık bağlıdır. Ve çok kullanıcı cevap kullanma olasılığı ne kadar bağlıdır.

İlk olarak, her zaman Akışı, veya tam tersi bir Koleksiyon alabilirsiniz

// If API returns Collection, convert with stream()
getFoo().stream()...

// If API returns Stream, use collect()
Collection<T> c = getFooStream().collect(toList());

Soru arayanlar için daha yararlı olduğunu, bu yüzden.

Eğer sonuç sonsuz olabilir varsa, yalnızca tek bir seçenek var: Akış.

Eğer sonucu çok büyük olabilir, muhtemelen o anda hayata tüm herhangi bir değeri olmayabilir beri Stream tercih, ve böylece önemli bir yığın baskı yaratabilir.

Eğer arayan kişi yapacak. yineleme (arama, filtre, toplama) gerekir tercih Stream, Stream beri var bu yerleşik için zaten bir şey yok hayata bir koleksiyon (özellikle eğer kullanıcı olmayabilir süreci tüm sonuç.) Bu çok yaygın bir durumdur.

Bile kullanıcı olacak yineleme birden çok kez ya da başka tutmak etrafında, sen yine de geri Akışı yerine, basit gerçek her neyse Koleksiyonu seç koy (örneğin, ArrayList) olmayabilir formu istiyorlar, sonra da arayan var kopyalamak zaten. eğer bir akarsu dönmek, collect(toCollection(factory)) yapın ve tam olarak ne istediklerini şeklinde alabilirsiniz.

Yukarıdaki "tercih Stream" vakalar çoğunlukla türetmek aslında bu Yayını daha esnek, geç bağlamak için nasıl kullanırsınız o olmadan ödemeden maliyetleri ve kısıtlamaları hayata bir Koleksiyon.

Bir Koleksiyon dönmek zorunda nerede bir durumda güçlü tutarlılık gereksinimleri vardır, ve hareketli bir hedef olarak tutarlı bir anlık görüntü üretmek zorunda. O zaman, değişmez bir koleksiyon öğeleri koymak isteyebilirsiniz.

Yani bunu çoğu zaman, Akışı doğru cevap ... daha esnek, değil mi empoze genellikle gereksiz hayata geçirilmesi maliyetleri ve kolayca dönüştüğünü Koleksiyonu seçiminiz gerekirse. Ama bazen de, dönmek Koleksiyonu (ki, sayesinde güçlü bir tutarlılık gereksinimleri), ya da isteyebilirsiniz dönüş Koleksiyonu biliyorsun çünkü kullanıcı nasıl kullanacak ve bu en uygun şey için onları.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BioHunta

    BioHunta

    28 Mayıs 2006
  • Call Me Howard

    Call Me Howa

    18 AĞUSTOS 2012
  • Vicious Computers

    Vicious Comp

    14 EKİM 2006