在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));