你觉得哪个更优雅?一个普通的旧 for 循环:
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 中尝试了代码后,我发现我必须将return null
语句添加到eatFunction
,因为 1)与 2)Void
不一样,void
并且它是不可实例化的。比想象中的还要丑!:)
同样从性能的角度来看,使用上面的一些复制构造函数调用惰性函数也会毫无意义地分配内存。创建一个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);