Herhangi bir eski koda bağlı olmayan API'mı geliştirirken, genellikle sonuçları toplayarak tamamen Streams pipeline olan sonlandırılmış yöntemler yazıyorum. Bunun gibi:
ImmutableSet<T> deriveSomethingMeaningfulFromPrivateState() {
return myPrivateThingies.stream()
.map(this::ownerOfThing)
.map(Owner::socialStatus)
.filter(SocialStatus::isHeAFineMatey)
.collect(MyCustomCollectors.toImmutableSet());
}
Şimdi, bu sınıftaki müşterilerin çoğu genellikle öğeleri aramak ve yinelemek için Koleksiyona (bu durumda bir ImmutableSet) ihtiyaç duyacaktır, ancak bazı istemciler bir Akışa sahip olmaktan yararlanabilir, böylece bunun üzerine daha fazla işlem yapabilirler. Koleksiyondan yeni bir akış edinmeye gerek kalmadan akış gerçekleştirin. Bu nedenle, bir Akışa geri dönmek, müşterilere Koleksiyona sahip olmaları durumunda sahip olacakları bir seçenekler kümesi sunar (sonuçta, her zaman Akışın collect()
kendileri olabilirler:
Stream<T> deriveSomethingMeaningfulFromPrivateState() {
return myPrivateThingies.stream()
.map(this::ownerOfthing)
.map(Owner::socialStatus)
.filter(SocialStatus::isHeAFineMatey);
// No collect
}
Bu yaklaşım, deneyebileceğim herhangi bir potansiyel kusur görmediğim için denemek için cazip geliyor. Ancak, herhangi bir kütüphanede bu yaklaşımı hiç görmedim (muhtemelen Java 8'in ortaya çıkmasından sonra pek çok kütüphane yayınlanmadığı için), bu yüzden benimsemekten biraz korkuyorum. Mevcut kütüphane sınıfları genellikle özel durumdan bir şey türettiklerinde Koleksiyonları döndürür.
Java-8 öncesi kendimin bir Koleksiyon döndüreceği her yere bir Akış döndürmeye karar verirsem olabilecek kötü bir şey var mı ? Ya da büyük olasılıkla burada özel devletten türeyen bir antipattern bir şey mi yapıyorum?