如何模拟Java中的函数式编程,特别是将某个函数映射到一组项目中?
Java中的函数式编程
map(func, new String[]{"a","b","c"});
什么是最详细的&尴尬的方式做到这一点?
如何模拟Java中的函数式编程,特别是将某个函数映射到一组项目中?
Java中的函数式编程
map(func, new String[]{"a","b","c"});
什么是最详细的&尴尬的方式做到这一点?
不幸的是函数式编程的所有尝试都将有详细和/或尴尬一些零件,将它在Java中。
最直接方法是提供一个Function
接口(如this one form Guava),并提供各类称取方法和调用它(如Collections#transfrom()
它做什么,我觉得你map()
方法应该做的)。
约坏事是,你需要实现Function
并经常与一个匿名内部类,它有一个非常详细的语法这样做:
Collection<OutputType> result = Collections.transform(input, new Function<InputType,OutputType>() {
public OutputType apply(InputType input) {
return frobnicate(input);
}
});
应当指出的是,爪哇计划LAMBDA功能8将使这相当容易(甚至可能更快!)。在等效代码的lambda(目前形式)是这样的:
Collection<OutputType> result = Collections.transform(input, SomeClass::frobnicate);
或更详细的,但更灵活:
Collection<OutputType> result = Collections.transform(input, in -> frobnicate(in));
我已经使用lambdaj和functionaljava这类东西。而且有可能是别人...
只是包装要应用列表中的功能与类或接口。
public interface Func {
Object f(Object input);
}
public void map (Func func, Object[] arr) {
for(int i=0;i<arr.legnth;i++) {
arr[i] = func.f(arr[i]);
}
}
map(
new Func() { public Object f(Object input) { return input; } };,
new String[]{"a","b"});
正如你是,Java不适合函数式编程,虽然你可以效仿它,你要真想做到这一点,即使是更详细的比Java中使用标准的编程更加尴尬。
Take @ Joachim的例子。
Collection<OutputType> result = Collections.transform(input, new Function<InputType,OutputType>() {
public OutputType apply(InputType input) {
return frobnicate(input);
}
});
这使用12个符号,不包括近括号。在普通的Java中看起来是一样的。
List<OutputType> list = new ArrayList();
for(InputType in: input)
list.add(frobnicate(in));
这使用7个符号。
您可以用Java编写函数式编程,但您应该期望它比使用Java的自然编程风格更加冗长和尴尬。
您可以下载定于明年发布的OpenJDK 8,并使用新的Lambda表达式进行函数式编程。请参阅http://macgyverdev.blogspot.se/2012/10/functional-programming-in-java.html以获取如何在Collection API中使用这些闭包以及如何与Guava和LambdaJ之前的Java 8解决方案进行比较的示例。