Lambda表达式的参数/声明

4

我已经注册了一段时间,通常只有在找不到答案时才会发布帖子,而现在,我感到非常困惑。

最近我才开始熟悉Java Lambda表达式(主要是函数表达式)例如BinaryOperator和Bifunction。在查看它们的源代码时,我发现你将它们声明为:

public interface BiFunction<T, U, R> {...}.

所以我认为没有办法在运行时动态创建一个类似于BiFunction但具有多个参数和“方程式”的接口。

我将给出一个实际的例子,我认为这将更好地解释我想要解决的问题类型:

假设我想制作一个程序,用户可以输入一个数学函数并在一个点上进行评估。首先,让我们假设它是一个单变量函数:

Function<Integer,Integer> f1 = (x) -> Math.pow(x,2);

除非我在运行时定义函数f(x) = x^2,否则这将是解决问题的方法。

我想知道是否有一种方法可以在运行时创建一个函数,询问用户他们想输入哪个函数。

如果用户可以输入具有多个参数的方程,则此问题可能更加复杂。

感谢任何帮助。

Max

1个回答

3
你需要的是柯里化(currying)。给定一个接受参数 a、b 和 c 的函数f,你可以定义一个带有参数a并返回一个接受参数b和c的函数g的柯里化版本的函数f。继续进行柯里化过程,你只需要担心以下三种情况:
1. 零个参数。调用该函数。 2. 一个参数。使用给定参数调用该函数。 3. 两个或更多参数。对函数进行柯里化,并重新评估,因为柯里化后的函数将具有较少的参数数量。
所以如果你想使用lambda表达式,你需要定义一个柯里化函数。当然,你可能还需要在运行时定义支持任何代数的相关运算符,但这可能是一个固定的符号表(也可以像接受参数的函数/lambda一样定义成哈希表)。

谢谢你的回答,我会研究一下Java中的柯里化。 - Max

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接