0

我正在编写一些我有时需要但不经常需要的代码,并且想知道为什么它需要这么多行代码。我需要使用从另一个集合的对象中的方法返回的字符串创建一个新集合。我可能会在该类的三种不同方法上执行此操作三次。我想番石榴中可能有一些东西可以帮助我。就像是:

collection = Iterators.collectNotNull( myCollection, new Function...{
    public String apply( MyObject input ) {
        String value = input.getStringValue();
        if ( StringUtils.isEmpty( value )
            return null;
        return value; } );

我的意思是这对我来说甚至是太多的代码行。但无论哪种方式,我基本上都是在需要的时候写上面的。

所以问题是,谁能用更少的代码更简单地做到这一点?您可以使用现有的主流库,例如 Apache commons 或 Guava。如果您想消除创建匿名内部以获取将返回值的方法的需要,则反射是可以的。以上是我最好的尝试,但我必须编写可重用的“collectNotNull”方法。我宁愿不必。

4

3 回答 3

3

如果您的目标是减少代码,那么显而易见的方法是最好的。

 List<String> list = Lists.newArrayList();
 for (MyObject input : myCollection) {
   String value = input.getStringValue();
   if (!value.isEmpty()) {
     list.add(value);
   }
 }

请参阅Guava wiki page on functional idioms:它们通常是矫枉过正的。

于 2012-12-21T17:53:18.683 回答
0

如果 Java 有高阶函数……</p>

好吧,我们不要走那条路。

在 Java 中接近这一点的一种方法是使用foreach

for (Collect<Type> each: ForEach.collect(input)) 
    each.yield = each.value.method(); 
for (Reject<String> each: ForEach.reject(ForEach.result())) 
    each.yield = each.value.isEmpty(); 
result = ForEach.result()
于 2012-12-22T01:38:37.270 回答
0

这个:

 myCollection.removeAll(Arrays.asList(null, ""));

例子:

List<String> myCollection = new LinkedList<String>(Arrays.asList("a", "", "b", null, "c"));
System.out.println(myCollection);
myCollection.removeAll(Arrays.asList(null, ""));
System.out.println(myCollection);

产生:

[a, , b, null, c]
[a, b, c]

更新:虽然这不是很普遍,但您可以保留或删除所有与这种方式相同的元素。

在 Java 8(可预览版)中,您可以这样做:

myCollection.filter(s -> s != null && !s.isEmpty())

并对结果做一些事情(add into() 以将它们添加到列表或 map() 进一步等)。

于 2012-12-21T19:31:13.310 回答