【问题标题】:Returning a function from inside another function in Java从Java中的另一个函数内部返回一个函数
【发布时间】:2021-02-19 22:59:02
【问题描述】:

既然我们可以在 Java 编程语言中采用一些函数式编程概念,是否也可以编写一个返回另一个函数的函数? Since Higher order functions do that。就像 JavaScript 一样?

Here is 返回函数的 JavaScript 代码。

function magic() {
  return function calc(x) { return x * 42; };
}

var answer = magic();
answer(1337); // 56154

【问题讨论】:

  • 这能回答你的问题吗? Function within a function in Java
  • @Dren 没有 Dren。这是一个不同的问题。我想知道是否可以从 Java 中的另一个函数内部返回一个函数。没有在函数内部定义函数,这是我们不能做到的。
  • 当你说的“函数”是指函数接口的方法或实例?
  • 从技术上讲,您无法返回函数,但您可以返回表示函数的类的实例,在您的情况下为 UnaryFunction。虽然很丑。
  • 当我说“函数”时,我指的是“方法”@sepp2k

标签: java functional-programming higher-order-functions functional-interface


【解决方案1】:

最接近的 Java 等效项是:

public static void main(String[] args) {
    UnaryOperator<Integer> answer = magic();
    System.out.println(magic().apply(1337));  // 56154
    System.out.println(answer.apply(1337));   // 56154
}

static UnaryOperator<Integer> magic() {
    return x -> x * 42;
}

【讨论】:

    【解决方案2】:

    是的,你可以

    Function<String, Integer> getLengthFunction() {
        return String::length;
    }
    

    你可以更进一步。例如。实现currying:

    static <T, U, R> Function<T, Function<U, R>> curry(BiFunction<T, U, R> f) {
        return t -> u -> f.apply(t, u);
    }
    

    【讨论】:

    • 这很漂亮,我以前从未见过这样的实现,是的,它是一个函数返回。谢谢你。但是 Nikolas 的回答是根据我的问题的例子,并且会让下一位读者清楚。
    【解决方案3】:

    这是我不久前写的另一个例子。它根据提供的参数返回一个转换函数。

    // generate a Celsius to Fahrenheit Converter.
    DoubleUnaryOperator cToF = conversionGen(9 / 5., 32);
    
    // Fahrenheit to Celsius
    DoubleUnaryOperator fToC =
            conversionGen(5 / 9., (-32 * 5 / 9.));
    
    // kilometers to miles
    DoubleUnaryOperator kiloToMiles = conversionGen(.6, 0);
    
    // and pounds to Kilograms.
    DoubleUnaryOperator lbsToKgms = conversionGen(1 / 2.2, 0);
    

    现在您所要做的就是使用单个参数调用它们。

    double farTemp = cToF.applyAsDouble(100);
    double celTemp = fToC.applyAsDouble(212);
    System.out.println(farTemp);
    System.out.println(celTemp);
    System.out.println(kiloToMiles.applyAsDouble(1500));
    System.out.println(lbsToKgms.applyAsDouble(4.4));
    

    打印

    212.0
    100.0
    900.0
    2.0     
    

    发电机。

    public static DoubleUnaryOperator conversionGen(double factor,
                double base) {
            return unit -> unit * factor + base;
    }
    

    【讨论】:

    • 是的,这是正确的,非常感谢您提供详细解释的答案。我将不得不选择 Nikolas 的答案,因为它是根据我的问题的解释并且很快。
    • @KidusTekeste 无需解释。重要的是你得到了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多