這裏是相當於你已經在您的文章中給出的功能僞完整的工作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上的一種功能語言,它使用與上述相同的方法來實現lambdas和更高階的函數,並且提供與Java同等的性能。不過,我建議您應該剖析代碼並確定它是否滿足您特定用例的性能要求。
非常感謝您的回答。這樣做的一個意識形態問題是,它正在用命令式語言實施一個功能範式。實際的問題是這會影響執行時間。我不確定使用標準Java(Sun-but-now-Oracle)編譯器對用於實現更高階函數的機器進行了優化(如您所示)。 – KXS 2011-04-08 05:42:10
我知道它們是醜陋的,不衛生的,我根本不是一個大粉絲,它可能是邪惡的,宏觀機制(如C迭代器宏),這將使我能夠簡單地內聯附加結果計算,似乎是我能想到的唯一方法就是解決實際問題。 ...或者我只是沒有足夠的努力。 – KXS 2011-04-08 05:42:10