Java的java/util/function/BiFunction的C#等价物是什么?



在Java中有一个叫做BiFunction的接口,它的源代码是:

@FunctionalInterface
public interface BiFunction<T, U, R> {
R apply(T t, U u);
default <V> BiFunction<T, U, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t, U u) -> after.apply(apply(t, u));
}
}

oracle文档中是这样描述的:

表示接受两个实参并产生一个结果。这是函数的二元特化。这是一个函数方法为apply(Object, Object)的函数接口。

apply

R apply(T t, U u)将此函数应用于给定的参数。参数:t—第一个函数参数u—第二个函数参数返回:函数结果

andThen

default <V> BiFunction<T,U,V> andThen(Function<? super R,? extends V> after)

返回一个首先应用this的组合函数函数的输入,然后将after函数应用于结果。如果任何一个函数的求值都抛出异常,那么它就是传递给组合函数的调用者。类型参数:V-after函数和组合函数的输出类型参数:after—此函数后应用的函数applied返回:一个首先应用此函数的组合函数然后应用after函数抛出:NullPointerException- ifafter为null

我想知道如何在C#中实现这个接口作为一个类或扩展方法,并且在默认情况下C#中是否有这个类?

不像Java那样使用函数式接口来表示函数,c#使用委托。有一个内置的委托-Func<T1,T2,TResult>,它代表一个函数,有2个参数和一个非void返回值,就像Java中的BiFunction

对于apply委托,您可以像调用函数/方法一样调用它们。例子:

Func<int, int, int> add = (x, y) => x + y;
// similar to: System.out.println(add.apply(1, 2));
Console.WriteLine(add(1, 2));

如果你真的想在这里写一个字,你可以写Invoke:

add.Invoke(1, 2);

它没有andThen方法,但是你可以为它写一个扩展方法:

public static Func<T1, T2, R> AndThen<T1, T2, U, R>(this Func<T1, T2, U> bifunction, Func<U, R> andThen)
=> (x, y) => andThen(bifunction(x, y));

最新更新