web-dev-qa-db-ja.com

グアバ:フィルターと変換を組み合わせる方法?

文字列のコレクションがあり、それを文字列のコレクションに変換したいのですが、すべて空またはnullの文字列が削除され、他の文字列はすべてトリミングされています。

私は2つのステップでそれを行うことができます:

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]

しかし、2つのアクションを1つのステップに組み合わせるグアバの方法はありますか?

47

の中に 今後の Guavaの最新バージョン(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();
80