2010-11-25 19 views
46

Ben Strings bir koleksiyonu var ve dizeleri bir koleksiyon dönüştürmek istiyorum tüm boş veya null Strings kaldırılır ve tüm diğerleri budandı.Guava: Filtreyi nasıl birleştirir ve dönüştürür?

ben iki adımda yapabilirsiniz: tek adımda içine iki eylemleri birleştirerek bir Guava yolu

final List<String> tokens = 
    Lists.newArrayList(" some ", null, "stuff\t", "", " \nhere"); 
final Collection<String> filtered = 
    Collections2.filter(
     Collections2.transform(tokens, new Function<String, String>(){ 

      // This is a substitute for StringUtils.stripToEmpty() 
      // why doesn't Guava have stuff like that? 
      @Override 
      public String apply(final String input){ 
       return input == null ? "" : input.trim(); 
      } 
     }), new Predicate<String>(){ 

      @Override 
      public boolean apply(final String input){ 
       return !Strings.isNullOrEmpty(input); 
      } 

     }); 
System.out.println(filtered); 
// Output, as desired: [some, stuff, here] 

Ama var? Guava ait yaklaşan son sürümü (12.0) olarak

+0

olarak skaffman notlar;: FluentIterable kullanma

, böyle bir şey yapmanın mümkün olmalıdır neden 'Strings' API eklemek talebinde bazı statik' Function' ler ve 'Predicate' işte bu şekilde mantıklı örnekler için - Notunuza gibi bazı oldukça sık kullanılan fonksiyonlar pişmiş değil ilgili? Kullanıcıları http://code.google.com/p/guava-libraries/issues/list adresinde makul bir şekilde yanıtlarken buldum. – Carl

+0

@Carl peki http://code.google.com/p/guava-libraries/issues/list?can=2&q=reporter:sean,mostlymagic.com adresinde boru hattında sorun var. sinirlerini almak için. Ama bunu yapabilirim, çünkü sonunda Guava'yı benim için ortak/lang ve müşterek/ustaları değiştirmek istiyorum ve bunun için hala çok uzun bir yol var. –

+2

Sanırım filtreleyebilir ve dönüştürebilirsiniz. Yani sıfır durumunuzu –

cevap

77

, FluentIterable adında bir sınıf olacak. Bu sınıf, bu tür şeyler için eksik akıcı API'yi sağlar. bunu yapmak için en basit yol hakkında,

final Collection<String> filtered = FluentIterable 
    .from(tokens) 
    .transform(new Function<String, String>() { 
     @Override 
     public String apply(final String input) { 
     return input == null ? "" : input.trim(); 
     } 
    }) 
    .filter(new Predicate<String>() { 
     @Override 
     public boolean apply(final String input) { 
     return !Strings.isNullOrEmpty(input); 
     } 
    }) 
    .toImmutableList(); 
+1

Eğer Java 8, FluentIterable' 'kullanımına ise Java 8 akışları lehine cesaretinizi yitirmeden Not. –

+0

Çok kaygan. Buna sevindim sevindim. –