【问题标题】:Lambda Expression Parameters/declarationLambda 表达式参数/声明
【发布时间】:2015-06-10 09:42:57
【问题描述】:

我已经注册了一段时间,除非我真的找不到答案,否则我通常不会发帖,现在,我感到很困惑。

我最近才开始熟悉 Java Lambda 表达式(主要是函数表达式),例如 BinaryOperator 和 Bifunction..) 我正在查看这些的源代码,我看到您将它们声明为,例如:

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

所以在我看来,没有办法动态创建接口(类似于 BiFunction),但在运行时设置了许多参数和“方程式”。

我将举一个我认为可以更好地解释我想解决的问题类型的实际示例:

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

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

将是该问题的解决方案,除了我在运行前定义函数 f(x) = x^2 。 我想知道是否有办法在运行时创建一个函数,询问用户他们想输入哪个函数。

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

感谢您的帮助。

最大

【问题讨论】:

    标签: java function math lambda expression


    【解决方案1】:

    你需要的是柯里化。给定一个函数f,它接受参数abc,你可以定义一个f的柯里化版本,它接受参数a并输出一个函数g,它接受参数bc。继续柯里化过程,您将只需要担心 3 种情况:

    1. 零参数。调用函数。
    2. 一个论点。使用给定参数调用函数。
    3. 两个或更多参数。对函数进行柯里化,然后重新评估,因为柯里化函数的数量会减少。

    因此,如果您想使用 lambda,您需要定义一个 lambda 来柯里化一个函数。当然,您可能还需要为您想在运行时支持的任何代数定义相关的运算符,但这可能是一个固定的符号表(并且可能同样可以定义为函数/lambdas 带参数的hastable)。

    【讨论】:

    • 感谢您的回答,我将研究 Java 中的柯里化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 2013-10-12
    • 1970-01-01
    相关资源
    最近更新 更多