我已经注册了一段时间,通常不会发帖,除非我真的找不到答案,现在,我觉得很卡。
我最近才开始熟悉 java Lambda 表达式(主要是函数表达式),例如 BinaryOperator 和 Bifunction..)我正在查看这些的来源,我看到你将它们声明为,例如:
public interface BiFunction<T, U, R> {...}.
所以在我看来,没有办法动态创建一个接口(interface)(类似于 BiFunction),但在运行时设置了一些参数和“方程式”。
我将给出一个实际示例,我认为它可以更好地解释我想解决的问题类型:
假设我想制作一个程序,用户可以在其中输入一个数学函数并在一个点上对其进行计算。首先,假设它是一个单变量函数:
Function<Integer,Integer> f1 = (x) -> Math.pow(x,2);
将是问题的解决方案,除了我在运行时之前定义函数 f(x) = x^2 。 我想知道是否有一种方法可以在运行时创建一个函数,询问用户他们想输入哪个函数。
如果用户可以输入具有多个参数的方程式,那么这个问题可能会变得更加复杂。
感谢您的帮助。
最大
最佳答案
为此,您需要柯里化(Currying)。给定一个接受参数 a
、b
和 c
的函数 f
,您可以定义 的柯里化(Currying)版本f
接受参数 a
并吐出一个函数 g
接受参数 b
和 c
。继续柯里化(Currying)过程,您将只需要担心 3 种情况:
- 零参数。调用函数。
- 一个论点。使用给定参数调用函数。
- 两个论点或更多。柯里化(Currying)函数,并重新评估,因为柯里化(Currying)函数的数量会减少。
因此,如果您想使用 lambda,则需要定义一个柯里化(Currying)函数的 lambda。当然,您可能还需要为您希望在运行时支持的任何代数定义相关的运算符,但这可能是一个固定的符号表(并且可能同样被定义为带参数的函数/lambda 的 hastable)。
关于java - Lambda 表达式参数/声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30752719/