2011-04-21 31 views
5

Ben dersim var - Ben ettik şimdiayıklanıyor nesneler

public class Data implements Identifiable{ 
    private Integer id; 

    public Integer getId(){ 
     return id; 
    } 
} 

iki Ben List<Data> ayıklamak istiyorum

List<Data> data1 = // few hundred Objects 

Set<Integer> dataIds = // few object ids 

collections- data1 belgesinde bulunan ift'ler aşağıdaki gibidir: benim yaklaşımım nasıl olmalıdır? Sınıfımdaki guava'yı kullanıyorum, böylece performans/verimlilik açısından karşılaştırılabilirse guava'nın Fonksiyonel yaklaşımı ile devam edebilir.

+2

dataID en karşılık nesnelerin kimlikleri Listeye, neden kimse bir tamsayı diğer bir uzun olduğu zaman nedir? Ayrıca, hangi koleksiyon türü kullanılır? Örneğin. : Data1 bir ArrayList veya bir LinkedList mi? – dominicbri7

+0

bir hataydı .. düzeltildi – Premraj

cevap

3

Tek yapmanız gereken, sonuçta bir kez yineleme yapmak ya da yeniden kullanılabilir canlı filtrelenmiş bir görünüme gereksinim duymanız gerekmedikçe, eşleşmeleri içeren görünmeyen bir liste oluşturmak isteyebilirsiniz. Sonucu saklamak ve daha sonra veri listesi boyunca yinelemek ve eşleşmeleri eklemek için List veya Set oluşturmak, mükemmel bir yaklaşımdır ve anlaşılması kolaydır!

List<Data> result = Lists.newArrayList(); 
for (Data data : data1) { 
    if (dataIds.contains(data.getId())) 
    result.add(data); 
} 

Ben senin Data sınıf bir Identifiable arabirimini uygulayan görüyoruz. Bunu göz önünde bulundurarak, 0 ... Identifiables.getIdFunction() ya da bir şey alan bir Function<Identifiable, Integer> oluşturabilirsiniz. Bu hoş bir şeydir çünkü başka yerlerde de yararlı olabilir ( here numaralı blogda bu yaklaşım hakkında konuşuyorum). Bunun üzerine yerinde, Guava ile bunu yanı oldukça basit olacaktır:

Predicate<Identifiable> predicate = Predicates.compose(
    Predicates.in(dataIds), Identifiables.getIdFunction()); 
List<Data> filtered = Lists.newArrayList(Iterables.filter(data1, predicate)); 

Bu temelde ilk örneğe işlevsel olarak eşdeğer, ancak anlamak zor olacak gibi görünüyor. Bunu yapmak için net bir fayda olmadığından (sadece canlı görüntüyü kullanmak istediğiniz bir durumdan farklı olarak), tavsiyem sadece birincisi ile gitmek olacaktır. LambdaJ ile

3

Nasıl

Collections2.filter(
    data1, 
    new Predicate<Data>() { 
     public boolean apply(Data d) { 
     return dataIds.contains(d.getId()); 
     } 
    } 
) 

Not;

hakkında Gerçekten gerekli olmadıkça remember not to overcomplicate şeyler.

+0

Bağlantı için teşekkürler .. nokta aldım :) – Premraj

0

yazabilirsiniz:

List<Data> result = extract(data1, on(Data.class).getId());