番石榴:如何结合filter和变换?

我有一个string的集合,我想将它转换为一个string的集合都是空的或空的string被删除,所有其他的被修剪。

我可以分两步来做:

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] 

但是,有没有一种将两种行为结合在一起的番石榴的方法?

即将到来的Guava最新版本(12.0)中,将会有一个名为FluentIterable的类。 这个类提供了这种东西缺lessstream利的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();