番石榴:如何结合过滤和转换?

Sea*_*oyd 47 java guava

我有一个字符串的集合,我想将它转换为字符串集合全部为空或null删除字符串,其他所有字符串都被修剪.

我可以分两步完成:

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]
Run Code Online (Sandbox Code Playgroud)

但是有没有一种将这两种行为合并为一步的番石榴方式?

Oli*_*ann 80

即将推出的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();
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您使用的是Java 8,则不鼓励使用"FluentIterable"以支持Java 8流. (2认同)