假设,我有两个函数。
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中有可能吗?
发布于 2015-12-06 11:31:25
不,你不能用Function做这件事。
假设您有一个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和f2结果的乘法。因为我们知道两个操作数都是double,所以可以安全地进行乘法。
发布于 2015-12-07 19:39:12
也许您应该看看函数接口的andThen()组合方法。
例如,如下所示:
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);
产出:
90000.0
或者,如果要反转顺序(首先应用Math.pow(),然后乘以3):
Double result = f2.andThen(f1).apply(x);
产出:
30000.0
这也同样有效。
andThen()方法允许您将函数“链接”在一起。如果f1的输出类型与f2的输入类型匹配,那么您就都设置好了。您可以尽可能地继续链接,因为andThen()方法实际上返回了一个新的Function<>对象。
https://stackoverflow.com/questions/34116844
复制相似问题