从 Java 中的另一个函数内部返回一个函数

问题描述

既然我们可以采用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

解决方法

最接近的 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;
}
,

是的,你可以

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

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

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

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

// 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;
}