2010-11-25 64 views
46

我有一個字符串的集合,我想將它轉換爲一個字符串集合都是空的或空的字符串被刪除,所有其他都被修剪。番石榴:如何結合過濾和變換?

我可以做的兩個步驟:

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] 

但有兩個動作組合成一個步驟的番石榴方式?

+0

爲skaffman指出,這是對最簡單的辦法做到這一點;至於你關於一些非常用的函數沒有被烘焙的提示 - 爲什麼不要求`Strings` api爲這樣的明智例子添加一些靜態的`Function`和`Predicate`?我在http://code.google.com/p/guava-libraries/issues/list上找到了維護人員的合理響應。 – Carl 2010-11-25 17:06:33

+0

@Carl以及我已經在管道中發佈了http://code.google.com/p/guava-libraries/issues/list?can=2&q=reporter:sean,mostlymagic.com,我不想要讓他們緊張起來。但是我可能會這樣做,因爲最終我希望Guava能夠替代commons/lang和commons/io,而且爲此我們還有很長的路要走。 – 2010-11-25 17:17:43

回答

77

即將推出最新版本(12.0)的番石榴,將有一個類FluentIterable。 該類爲這類東西提供了缺少的流暢API。

使用FluentIterable,你應該能夠做這樣的事情:

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();