这是与您在帖子中提供的功能性伪代码等效的完整工作 Java 代码:
import java.util.*;
interface Function1<A, B> {
public B apply(final A a);
}
class Main {
public static <A, B> List<Function1<A, B>> addFunc(final Function1<A, B> f, final List<Function1<A, B>> fs) {
final List<Function1<A, B>> gs = new ArrayList<Function1<A, B>>();
gs.addAll(fs);
gs.add(f);
return gs;
}
public static <A, B> List<B> applyAllFuncs(final List<Function1<List<A>, B>> fs, final List<A> as) {
final List<B> bs = new ArrayList<B>();
for(final Function1<List<A>, B> f : fs) {
bs.add(f.apply(as));
}
return bs;
}
public static Function1<List<Double>, Double> min = new Function1<List<Double>, Double>() {
public Double apply(final List<Double> xs) {
double mx = xs.get(0);
for(final Double x : xs) {
if(x < mx) {
mx = x;
}
}
return mx;
}
};
public static Function1<List<Double>, Double> avg = new Function1<List<Double>, Double>() {
public Double apply(final List<Double> xs) {
double sum = 0;
for(final Double x : xs) {
sum += x;
}
return sum / xs.size();
}
};
public static Function1<List<Double>, Double> max = new Function1<List<Double>, Double>() {
public Double apply(final List<Double> xs) {
double mx = xs.get(0);
for(final Double x : xs) {
if(x > mx) {
mx = x;
}
}
return mx;
}
};
public static void main(final String[] args) {
final List<Double> myArray = Arrays.asList(3.0, 8, 1, 2, 9);
List<Function1<List<Double>, Double>> funcs = new ArrayList<Function1<List<Double>, Double>>();
funcs = addFunc(min, funcs);
final List<Function1<List<Double>, Double>> funcs1 = addFunc(max, funcs);
final List<Double> answers = applyAllFuncs(funcs1, myArray);
final List<Function1<List<Double>, Double>> funcs2 = addFunc(avg, funcs);
final List<Double> answers2 = applyAllFuncs(funcs2, myArray);
System.out.println(answers + "\n" + answers2);
}
}
如果您使用现有的 Java 函数式编程库,例如 Functional Java 或 GridGain 提供的库,则可以避免大部分样板文件。
这其中并没有多少被优化掉,因为 JVM 从来就不是为这类东西而设计的。 Scala 是 JVM 上的函数式语言,使用与上述相同的方法来实现 lambda 和更高阶函数,并提供与 Java 相当的性能。我仍然建议您应该分析代码并确定它是否满足您特定用例的性能要求。