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

Java 番石榴:如何结合过滤和转换?,java,guava,Java,Guava,我有一个字符串集合,我想将它转换为一个字符串集合,所有空字符串或空字符串被删除,所有其他字符串被修剪 我可以分两步完成: final List<String> tokens = Lists.newArrayList(" some ", null, "stuff\t", "", " \nhere"); final Collection<String> filtered = Collections2.filter( Collections2.t

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

我可以分两步完成:

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]
最终列表令牌=
Lists.newArrayList(“some”,null,“stuff\t”,“”,“\nhere”);
最终收集已筛选=
集合2.0过滤器(
Collections2.transform(令牌、新函数(){
//这是StringUtils.stripToEmpty()的替代品
//为什么番石榴没有这样的东西?
@凌驾
公共字符串应用(最终字符串输入){
返回input==null?”:input.trim();
}
}),新谓词(){
@凌驾
公共布尔应用(最终字符串输入){
return!Strings.isNullOrEmpty(输入);
}
});
系统输出打印项次(过滤);
//输出,根据需要:[一些,东西,这里]
但是有没有一种番石榴方法可以将这两个动作组合成一个步骤呢?

在即将发布的最新版本(12.0)的番石榴中,会有一个名为。 此类为此类内容提供缺少的fluent API

使用Fluentitable,您应该能够执行以下操作:

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();
final Collection filtered=FluentIterable
.来自(代币)
.transform(新函数(){
@凌驾
公共字符串应用(最终字符串输入){
返回input==null?”:input.trim();
}
})
.filter(新谓词(){
@凌驾
公共布尔应用(最终字符串输入){
return!Strings.isNullOrEmpty(输入);
}
})
.toImmutableList();

正如斯卡夫曼指出的,这是最简单的方法;至于您提到的一些非常常用的函数没有被嵌入的注意事项,为什么不请求
字符串
api添加一些静态
函数
s和
谓词
s以获得类似的合理示例?我发现维修人员反应相当迅速。@Carl好吧,我已经在那里解决了管道中的问题,我不想让他们感到不安。但我可能会这么做,因为最终我想让番石榴代替我的commons/lang和commons/io,这还有很长的路要走。我想你可以过滤,然后转换。因此,不需要在您的transformation@sylvain:显然是的。感谢您,如果您使用的是Java 8,那么不鼓励使用
Fluentitable
,而支持Java 8流。非常流畅。很高兴我偶然发现了这个。