java8将数学运算符应用于函数的可能性

时间:2015-12-06 11:22:21

标签: java function lambda java-8

假设,我有两个功能。

Function<Double, Double> function1 = (x) -> (3*x);
Function<Double, Double> function2 = (x) -> (Math.pow(x, 2));

我想将这些功能相乘。所以我想得到这个lambda表达式:

(x) -> (3*Math.pow(x,3));

是否可以在Java 8中使用?

2 个答案:

答案 0 :(得分:2)

不,你不能用Function.multiply(other)来做到这一点。

假设您有一个Function<String, String> f1 = s -> s.substring(1); Function<String, Integer> f2 = s -> s.length(); 方法,那么使用以下两个函数执行乘法会产生什么结果?

DoubleUnaryOperator

但是,如果您使用Function<Double, Double>(或DoubleUnaryOperator f1 = x -> 3*x; DoubleUnaryOperator f2 = x -> Math.pow(x, 2); DoubleUnaryOperator f1xf2 = x -> f1.applyAsDouble(x) * f2.applyAsDouble(x); )重写功能,那么您可以拥有以下内容:

double

这里的区别在于我们知道函数的操作数是double并且它返回f1xf2

f1函数返回f2double结果的乘积。由于我们知道两个操作数都是{{1}},因此乘法可以安全地完成。

答案 1 :(得分:0)

也许你应该研究一下Function接口的andThen()组合方法。

例如,像这样:

signature=c("ANY", "numeric")

输出:

coerce()

或者如果你想颠倒顺序(首先应用Math.pow(),然后乘以3):

signature=c("integer", "numeric")

输出:

Function<Double, Double> f1 = (x) -> 3 * x; Function<Double, Double> f2 = (x) -> Math.pow(x, 2); Double x = 100d; Double result = f1.andThen(f2).apply(x);

同样有效。

andThen()方法允许您将功能“链接”在一起。如果f1的输出类型与f2的输入类型匹配,那么你们都已经设置好了。您可以根据需要继续链接,因为andThen()方法实际上返回一个新的函数&lt;&gt;对象