【问题标题】:What is the C# equivalent of Java's java/util/function/BiFunction?Java 的 java/util/function/BiFunction 的 C# 等价物是什么?
【发布时间】:2021-10-23 14:44:21
【问题描述】:

在 Java 中有一个名为 BiFunction 的接口和 this source

@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 document 声明它是这样工作的:

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

apply

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

andThen

default &lt;V&gt; BiFunction&lt;T,U,V&gt; andThen(Function&lt;? super R,? extends V&gt; after)

返回首先应用 this 的组合函数 函数到它的输入,然后将 after 函数应用于 结果。如果任一函数的求值引发异常,则为 转发给组合函数的调用者。类型参数:V - after 函数和组合函数的输出类型 参数:after - 这个函数之后要应用的函数是 应用返回:首先应用此函数的组合函数 然后应用 after 函数抛出:NullPointerException - if after 为空

我想知道如何在C#中将这个接口实现为类或扩展方法,C#中是否默认有这个类?

【问题讨论】:

  • 可能是System.Func&lt;TArg0, TArg1, TResult&gt;?

标签: java c# function equivalent


【解决方案1】:

C# 不像 Java 那样使用函数式接口来表示函数,而是使用delegates。有一个内置的委托 - Func&lt;T1,T2,TResult&gt;,它代表一个具有 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));

【讨论】:

  • Apply 方法呢?
  • @MamarezaAlipour 啊,我忘了解决这个问题。您可以像调用函数一样调用委托。您不需要apply 方法,这可以说是非常冗长。看看我是如何通过直接调用 AndThen 来实现的?
猜你喜欢
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 2011-01-10
  • 2016-07-26
  • 2010-12-07
  • 2010-11-22
相关资源
最近更新 更多