我正在编写一些我有时需要的代码,而不是经常,并且想知道它为什么需要这么多行代码。我需要使用从另一个集合的对象中的方法返回的字符串创建一个新集合。我可能会在该类的三种不同方法中执行此操作三次。我以为番石榴可能有东西可以帮助我。类似的东西:
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"方法。我不愿意这样做。
答案 0 :(得分:3)
如果你的目标是 less 代码,那么显而易见的方法是最好的。
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:它们通常有点过分。
答案 1 :(得分: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())
使用该结果执行某些操作(添加到()以将其添加到列表或map()中等等。)
答案 2 :(得分:0)
如果Java具有高阶函数......
好吧,我们不要走那条路。
在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()