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

在Java中从另一个函数内部返回函数,java,functional-programming,higher-order-functions,functional-interface,Java,Functional Programming,Higher Order Functions,Functional Interface,既然我们可以在Java编程语言中采用一些函数式编程概念,那么还可以编写一个返回另一个函数的函数吗。就像JavaScript一样 返回函数的JavaScript代码 函数魔术{ 返回函数calcx{return x*42;}; } 答案=魔术; 答复1337;//56154 是的,你可以 Function<String, Integer> getLengthFunction() { return String::length; } 你可以更进一步。例如,实施: 是的,你可以

既然我们可以在Java编程语言中采用一些函数式编程概念,那么还可以编写一个返回另一个函数的函数吗。就像JavaScript一样

返回函数的JavaScript代码

函数魔术{ 返回函数calcx{return x*42;}; } 答案=魔术; 答复1337;//56154 是的,你可以

Function<String, Integer> getLengthFunction() {
    return String::length;
}
你可以更进一步。例如,实施:

是的,你可以

Function<String, Integer> getLengthFunction() {
    return String::length;
}
你可以更进一步。例如,实施:


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

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

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

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

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

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

这回答了你的问题吗@德伦没有德伦。这是另一个问题。我想知道在Java中是否可以从另一个函数内部返回一个函数。不在函数中定义函数,我们不能。当你说函数时,你是指函数接口的方法或实例吗?从技术上讲,你不能返回函数,但你可以返回表示函数的类的实例,在你的例子中是UnaryFunction。但这很难看。当我说函数时,我指的是@sepp2kd方法。这能回答你的问题吗@德伦没有德伦。这是另一个问题。我想知道在Java中是否可以从另一个函数内部返回一个函数。不在函数中定义函数,我们不能。当你说函数时,你是指函数接口的方法或实例吗?从技术上讲,你不能返回函数,但你可以返回表示函数的类的实例,在你的例子中是UnaryFunction。但这很难看。当我说一个函数时,我指的是一个方法@sepp2kYes,这是正确的,非常感谢你解释得很好的答案。我必须选择尼古拉斯的答案,因为这是根据我的问题的解释,而且很快。@KidusTekeste无需解释。重要的是你得到了你的答案。是的,这是正确的,非常感谢你解释得很好的答案。我必须选择尼古拉斯的答案,因为这是根据我的问题的解释,而且很快。@KidusTekeste无需解释。重要的是你得到了答案。这很漂亮,我以前从未见过这样的实现,是的,这是一个函数返回。非常感谢。但是Nikolas的回答是根据我的问题的例子给出的,这会让下一位读者明白。这很漂亮,我以前从未见过这样的实现,是的,这是一个函数返回。非常感谢。但尼古拉斯的回答是根据我的问题的例子,并将明确为下一个读者。