假设,我有两个功能。
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中使用?
答案 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
函数返回f2
和double
结果的乘积。由于我们知道两个操作数都是{{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;对象