另一種解決方案是使用現有的java 8接口。
import static org.junit.Assert.*;
import java.io.UnsupportedEncodingException;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Function;
import org.junit.Test;
public class test {
@Test
public void java_functions_currying() throws UnsupportedEncodingException {
A a = new A(1);
Double[] b = {2d};
Double[] c = {3d};
Double[] d = {4d};
double res = B.g(a::f, b, c, d);
double res1 = B.g1(a::f1, b, c, d);
assertEquals(5, res, .01d);
assertEquals(5, res1, .01d);
}
public class A {
private double a;
public A(double a) {
this.a = a;
}
// f has type Function<Double[], BiConsumer<Double[], Double[]>>
// Function<T, R> where
// T = Double[]
// R = BiConsumer<Double[], Double[]>
public BiConsumer<Double[], Double[]> f(Double[] b) {
return (c, d) -> d[0] = a * (b[0] + c[0]);
}
// f1 has type Function<Double[], Function<Double[], Consumer<Double[]>>>
// Function<T, R> where
// T = Double[]
// R = Function<Double[], Consumer<Double[]>>
public Function<Double[], Consumer<Double[]>> f1(Double[] b) {
return c -> d -> d[0] = a * (b[0] + c[0]);
}
}
public static class B {
public static double g(Function<Double[], BiConsumer<Double[], Double[]>> funct, Double[] b, Double[] c, Double[] d) {
funct.apply(b).accept(c, d);
return d[0];
}
public static double g1(Function<Double[], Function<Double[], Consumer<Double[]>>> funct, Double[] b, Double[] c, Double[] d) {
funct.apply(b).apply(c).accept(d);
return d[0];
}
}
}
該方法f返回void,因此使用Consumer類是適當的。 消費者接受參數但不返回。
我已經添加了兩個解決方案。第一個使用BiConsumer接受兩個參數。
Java 8不提供TriFunction或TriConsumer接口,但這不是必需的。實際上,即使是BiFunction和BiConsumer接口也不需要,它們可以通過功能和消費者接口來創建。
BiFunction<T, U, R> <=> Function<T Function<U, R>>
BiConsumer<T, U> <=> Function<T, Consumer<U>
TriFunction<S, T, U, R> <=> Function<S, Function<T, Function<T, R>>>
TriConsumer<S, T, U> <=> Function<S, Function<T, Consumer<U>>>
Search for currying獲取有關函數,它們始終只取一個參數,但返回的功能,以獲得仍下落不明參數的詳細信息。
看起來你只是想把'a :: f'作爲一個方法引用,但是你現在只提供了僞代碼,這使得它很難幫助你。 –
@ Jon:使用僞代碼是因爲我不知道正確的語法:-) – justik
'funct'是實例,所以你不能像'funct(a,b,c)'那樣使用它,但是你可能想要使用它像'funct.calculate(a,b,c)'。你應該存儲/返回這種方法的結果。無論如何,爲了能夠在三個參數上調用'calculate',您需要具有可以接受這些參數的方法的功能接口。所以你需要類似'interface ThreeArrayFunction {double calculate(double [] a,double [] b,double [] c);}'。 – Pshemo