2014-09-30 6 views
5

Filtrelenecek bir nesne listesi var.Nesneleri filtrelemek için tasarım deseni

Bu filtreleme en az 3 kuraldan oluşacaktır. Örneğin bu şekilde

: basit, kendine yeten ve oldukça kolay bir hale çalışıyor görebilirsiniz olarak

public class Filtering { 

List<MyObject> myObjectList; 

List<MyObject> filterStep1(List<MyObject> myObjectList){ 

    for(Myobject myobj : myObjectList){ 
     if(isCriteriaSatisified){ 
      continue 
     } 
     else { 
      removeThisObjectFromList 
     } 
    } 
} 


List<MyObject> filterStep2(List<MyObject> myObjectList){ 

    for(Myobject myobj : myObjectList){ 
     if(isCriteriaSatisified){ 
      continue 
     } 
     else { 
      removeThisObjectFromList 
     } 
    } 
} 

} 

Bu yaklaşım gibi.

Fakat bunun yerine kullanmam gereken bir tasarım deseni var mı?

"Sorumluluk Zinciri" deseni, yukarıdaki koddaki filterStep1 & filterStep2'nin ayrı bir eleğe dönüştürüleceğini düşündüğüm bir şeydir.

+1

Koleksiyon nesneler için mükemmel filtreleme seçenekleri sağlayan Java8'in Akış API'sini düşünebilirsiniz. –

+1

Bu soru, [Kod Gözden Geçirme] (http://codereview.stackexchange.com/) için Yığın Taşması'ndan daha uygun olacaktır. – ZeroOne

+1

Sadece bir yorum: orijinal listeleri değiştiriyorsunuz. Filtreleme dediğim şey, orijinal listeyi değiştirmeden yalnızca geçerli öğeleri içeren yeni bir liste oluşturmak olacaktır. –

cevap

4

Bu "borular ve filtreler" kalıbıdır ve uygulamanız tamamken, yöntemlerde filtreleme mantığını kodlamamak daha iyidir. Bunun yerine, boolean koşullarınızın her biri için bir Predicate<MyObject> yazın (Java 8'de yerleşik olanı veya Guava'dan bir tane). Bunu test etmek çok daha kolaydır ve Streams API'sı veya Guava'nın koleksiyon görünümleri gibi mevcut temiz API'lere kolayca uygulanabilir.

+0

Filtreleme işlevlerinin daha temiz olduğunu kabul ediyorum ancak Java8 API'sini kullanamıyorum. Bu yüzden söz konusu önerilen seçeneğimi kullanacağım. Teşekkürler –

+0

@ blue-sky Desenin uygulanması için bir seçenek olarak Guava'ya bakın. – chrylis

2

Seçeneklerden biri kullanılarak Java 8 akışları:

myObjects.stream().filter(this::isCriteriaSatisified).filter(this::anotherCriteria) 

sizi varsayarsak sınıfınızda bir yöntem boolean isCriteriaSatisified(myObj) var. Daha sonra bu akışı başka bir Listeye toplayabilirsiniz.