gpt4 book ai didi

java - 从一个数组迭代计算多个结果

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:17:11 25 4
gpt4 key购买 nike

我想在数组或列表的一次迭代中计算多个函数,但可能想动态地增加函数列表。例如,我可能想计算最小值和最大值,然后在稍后的某个时间还需要平均函数(或任何其他线性复杂度函数)。所以,我可能想要一个高级规范(使用一些称为 addFuncapplyAllFuncs 的函数,例如

funcs = emptyFunctionList;    # no functions in funcs "list" yet
funcs = addFunc (min, funcs); # add minimum function
funcs1 = addFunc (max, funcs); # add maximum function

answers1 = applyAllFuncs (funcs1, myArray);

funcs2 = addFunc (avg, funcs); # add average function

answers2 = applyAllFuncs (funcs2, myArray);

我可以通过从这些传递给 foldl 的函数创建一个“ super 函数”,用函数式语言很容易地做到这一点,元编程可能是一种机制,也可以更有效地做到这一点Haskell/C++,但想知道是否有一种有效且不太复杂的方法可以在标准 Java 中正常完成(或可以完成)(无需做很多事情来模拟/实现更高级别的功能)。

最佳答案

这是与您在帖子中提供的功能伪代码等效的完整工作 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 相当的性能。我仍然建议您分析代码并确定它是否满足您的特定用例的性能要求。

关于java - 从一个数组迭代计算多个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5571235/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com