您认为哪个更优雅?一个普通的老循环:
for (Animal animal : animalList)
animal.eat();
还是“通过以函数式风格编写程序操作来弯曲程序语言”的疯狂?
static final Function<Animal, Void> eatFunction = new Function<Animal, Void>() {
@Override
public Void apply(Animal animal) {
animal.eat();
return null; // ugly as hell, but necessary to compile
}
}
Lists.newArrayList(Collections2.transform(animalList, eatFunction));
我会投票支持第一个案例。
如果你真的想用函数式风格编写你的程序,我建议你切换到另一种JVM语言。
Scala可能是这种情况的一个很好的选择:
animalList.foreach(animal => animal.eat)
甚至是使用占位符的更短的变体:_
animalList.foreach(_.eat)
编辑:
在 Eclipse 中尝试了代码后,我发现我必须将语句添加到 中,因为 1) 与 和 2) 不相同。这比预期的还要丑陋!:)return null
eatFunction
Void
void
同样从性能的角度来看,通过使用上面一些复制构造函数来调用惰性函数也毫无意义地分配内存。创建与仅填充 null 的大小相同的 a,只是为了立即进行垃圾回收。ArrayList
animalList
如果你真的有一个用例,你想传递一些函数对象并将它们动态地应用到一些集合上,我会编写我自己的函数接口和一个foreach方法:
public interface Block<T> {
void apply(T input);
}
public class FunctionUtils {
public static <T> void forEach(Iterable<? extends T> iterable,
Block<? super T> block) {
for (T element : iterable) {
block.apply(element);
}
}
}
然后,您可以类似地定义一个(小写)函数:void
static final Block<Animal> eatFunction = new Block<Animal>() {
@Override
public void apply(Animal animal) {
animal.eat();
}
};
并像这样使用它:
FunctionUtils.forEach(animalList, eatFunction);
// or with a static import:
forEach(animalList, eatFunction);