番石榴:如何结合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();