SORU
26 Kasım 2009, PERŞEMBE


Zarif bir şekilde bir Toplama Guava kullanarak dönüştürme sırasında boşluk kaldırmak için var?

Google Koleksiyonları ile bazı Toplama işleme kodu basitleştirilmesi ile ilgili bir sorum var, (güncelleme: Guava).

"Nesneler ve onların topluluğu"s" id "kaynak ile bitirmek istiyorum "Bilgisayarda bir sürü var Bu böyle yapılır:

Collection<Computer> matchingComputers = findComputers();
Collection<String> resourceIds = 
    Lists.newArrayList(Iterables.transform(matchingComputers, new Function<Computer, String>() {
    public String apply(Computer from) {
        return from.getResourceId();
    }
}));

Şimdi, getResourceId() null (ve bu değişen bir seçenek değil) döndürebilir, ancak bu durumda ortaya çıkan Dize koleksiyonundan boşluk atlamak istiyorum.

İşte boşluk filtrelemek için bir yol

Collections2.filter(resourceIds, new Predicate<String>() {
    @Override
    public boolean apply(String input) {
        return input != null;
    }
});

Hep birlikte bu gibi koyabilirsiniz:

Collection<String> resourceIds = Collections2.filter(
Lists.newArrayList(Iterables.transform(matchingComputers, new Function<Computer, String>() {
    public String apply(Computer from) {
        return from.getResourceId();
    }
})), new Predicate<String>() {
    @Override
    public boolean apply(String input) {
        return input != null;
    }
});

Ama bu hiç de böyle basit bir görev için şık dursun okunabilir. Aslında, Eski Java kod düz hiç süslü Yüklem ya da İşlevin şeylerle () muhtemelen çok daha temiz olurdu:

Collection<String> resourceIds = Lists.newArrayList();
for (Computer computer : matchingComputers) {
    String resourceId = computer.getResourceId();
    if (resourceId != null) {
        resourceIds.add(resourceId);
    }
}

Yukarıdaki kullanarak kesinlikle da bir seçenektir, ama merak (ve Google Koleksiyonları daha öğrenmek istiyorum)daha kısa ya da daha şık bir şekilde Google Koleksiyonları kullanarak aynı şeyi yapabilirsiniz?

CEVAP
26 Kasım 2009, PERŞEMBE


Zaten burada Koşullarına yardımcı olacak Predicates bir doğrulama yok.() notNull ve İterables kullanabilirsiniz.() filtre ve Listeler aslında.() newArrayList bir İterable bu biraz daha temiz olabilir.

Collection<String> resourceIds = Lists.newArrayList(
  Iterables.filter(
     Iterables.transform(matchingComputers, ... your Function ...),
     Predicates.notNull();
  )
);

Eğer gerçekten bir Koleksiyon ihtiyacın olursa, sadece bir İterable, Listeler.() newArrayList bir adım daha temiz sen de uzaklara gidebilir ve bir daha arama!

İşlevi yine kullanışlı ve en yararlı olarak ilan edilecektir bulabilirsin sanıyorum

public class Computer {
....
    public static Function<Computer, String> TO_ID = ...;
}

hatta daha fazla (ve yeniden kullanımı teşvik edecek) bu temizler.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jon Reed

    Jon Reed

    14 AĞUSTOS 2006
  • lifeisforsharingDT

    lifeisforsha

    18 Mayıs 2011
  • Microsoft Research

    Microsoft Re

    24 EKİM 2008