gpt4 book ai didi

java - 如何编写接收列表和两个 BiFunction 并对表达式求值的通用方法?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:33:29 31 4
gpt4 key购买 nike

我想编写一个接收 List l 的通用方法和两个 BiFunction f1, f2并返回以下表达式的结果:

(a0 + a1) * (a2 + a3) *...*(a_{n-1} + an) * an .

在这里a1,...,an是给定列表的元素,+表示 f1 , 和 *表示 f2 .

逻辑部分非常简单:

List<???> resF1 = new List<>(); //calculate result of f1 for each pair

for (int i = 0; i < l.size(); i += 2) {
resF1.add(f1.apply(l.get(i), l.get(i + 1)));
}

??? ans = f2.apply(resF1.get(0), resF1.get(1)); //get initial value of ans

for (int i = 2; i < resF1.size(); i++) {
ans = f2.apply(ans, resF1.get(i)); //successively evaluate from left to right
}

ans = f2.apply(ans, l.get(l.size() - 1)); //don't forget about the last term of expr

return ans;

困难的部分是选择泛型类型。

让我们开始表单方法签名

public static <F, S, T> ??? foo(List<? extends F> l, BiFunction<???, ???, ???> f1, BiFunction<???, ???, ???> f2)

假设我们的函数将具有三种通用类型,因此这些类型尽可能通用。

我猜列表的类型应该是<? extends F> ,因为我们想从中读取值,并且 ? extends仅用于该目的。

至于BiFunction : 由于我们将列表元素传递给它,我想前两个字段也应该是 ? extends F . ? extends , 出于与列表中相同的原因,但我们可以做到吗 ? extends S对于 f1? extends T对于 f2

f1 的结果类型似乎也是合乎逻辑的应该等于 f2 的参数类型,因为我们将它应用于 f2结果 f1 .但是,最后一项包含单个元素并且它有 ? extends F ,正如我们之前推断的那样。

至于返回值,我猜应该是TU .

那么,您将如何编写这样的方法?

最佳答案

看来你想多了。由于输入和输出类型相同,因此您只需要一个类型变量(如果不是,则需要第三个 BiFunction )。

在这种情况下,您还可以使用 BinaryOperator ,这基本上相当于 BiFunction<T, T, T> .结果是(复制你的算法):

public static <T> T dualFold(List<T> l, BinaryOperator<T> f1, BinaryOperator<T> f2) {
List<T> resF1 = new ArrayList<>(); //calculate result of f1 for each pair

for (int i = 0; i < l.size(); i += 2) {
resF1.add(f1.apply(l.get(i), l.get(i + 1)));
}

T ans = f2.apply(resF1.get(0), resF1.get(1)); //get initial value of ans

for (int i = 2; i < resF1.size(); i++) {
ans = f2.apply(ans, resF1.get(i)); //successively evaluate from left to right
}

ans = f2.apply(ans, l.get(l.size() - 1)); //don't forget about the last term of expr

return ans;
}

关于java - 如何编写接收列表和两个 BiFunction 并对表达式求值的通用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48598340/

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