- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想编写一个接收 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
,正如我们之前推断的那样。
至于返回值,我猜应该是T
或 U
.
那么,您将如何编写这样的方法?
最佳答案
看来你想多了。由于输入和输出类型相同,因此您只需要一个类型变量(如果不是,则需要第三个 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/
我想链接 BiFunctions,就像下面代码示例中的方法 chainWanted 一样。 BiFunction 将 Function 作为 AndThen 的参数。是否有可能以某种方式链接 BiFu
我遇到了以下问题:一个方法应该接受一个带有 2 个参数的双函数 - 一个是类型 Collection另一个是T ;实际功能实际上可能是 Collection::remove或 Collection::
我有一张 map ,我想在其中数数。在 Java 8 之前,我必须在映射中为每个键放置一个零,然后才能像 map.put(key, map.get(key)+1). 从 Java 8 开始,我现在可以
这个(大大简化的)代码无法为我编译。不知道为什么。返回类型为 Entry?和 null对我来说似乎是一个有效的值(value)。 val foo = BiFunction, Entry?> { foo
我想编写一个接收 List l 的通用方法和两个 BiFunction f1, f2并返回以下表达式的结果: (a0 + a1) * (a2 + a3) *...*(a_{n-1} + an) * a
这个问题已经有答案了: Why doesn't Java 8's ToIntFunction extend Function (2 个回答) 已关闭 4 年前。 我想知道为什么ToDoubleBiFu
传统的函数式语言在列表的初始值和累加器方面考虑减少。在 Java 中,事情更复杂,因为它需要 BinaryOperator。 我想知道我们是否有更好的方法来编写这种函数: public JsonObj
我一直只使用 Java 6,现在正 catch 学习 Java 8 中的新功能。我在这里阅读了这篇文章: http://www.drdobbs.com/jvm/lambda-expressions-i
我正在尝试从列表中识别其前身大于其值的数字。 在 lambda 表达式中,如果我返回 b,它的行为符合预期,但如果我返回 a,它会给出错误的输出。 这两个返回语句有什么区别? List lis
在尝试使用方法引用时,遇到了可以将 concat 方法用作 BiFunction 的情况,据我所知,BiFunction apply 方法需要 2 个输入参数并产生一个结果。然而,concat 方法接
我对在 java (util) 函数中将方法引用作为参数传递有疑问。 我有两个功能 Function f1 = (val) -> { Output o = new Output();
这个问题在这里已经有了答案: How to print two lists together using Stream API java 8? (3 个答案) 关闭 7 年前。 我需要知道如何申请
我创建了一个 GenericFunction 类,它实现了 Function 和 BiFunction。但是无法编译。 public class GenericFunction implements
BiFunction 接口(interface)的定义包含一个方法 apply(T t, U u),它接受两个参数。但是,我不明白这个接口(interface)和方法的用途或目的。我们需要这个接口(i
我一直在尝试使用 Java 进行函数式编程。但是,当我在类中使用功能接口(interface)作为一级变量时,编译时无法识别我的变量。 我试图将其设为 main 中的局部变量,但收到了相同的结果。 我
我正在尝试将我的 Java 类转换为 Kotlin。这是Java代码: Observable.just("Stacey") .zipWith(Observable.just(6), (
我不明白为什么Map.compute()和Map.computeIfPresent()拿BiFunction参数以及Map.computeIfAbsent()一个Function : V comput
考虑以下简化的测试用例: import java.util.AbstractList; import java.util.Collection; import java.util.Iterator;
我不明白为什么Map.compute()和 Map.computeIfPresent()拿BiFunction参数以及 Map.computeIfAbsent()一个Function : V comp
在初始化 TreeMap、TreeSet 等集合时,我们可以添加自定义比较器。代码看起来像这样: Map map1 = new TreeMap<>(new Comparator() { pub
我是一名优秀的程序员,十分优秀!