2016-08-25 42 views
3

我想了解功能接口用Java 8.設F()將函子:是否有可能在Java中使用的對象的特定方法(或靜態方法),爲算符8

public class A { 
    private double a; 

    public A(double a_) { 
     a = a_; 
    } 

    public void f(double[] b, double[] c, double[] d) { 
     d[0] = a * (b[0] + c[0]); 
    } 
} 

是否可以使用Java 8功能界面創建類似的構造?

public class B { 
    public double g(Function funct, double[] b, double[] c, double[] d) { 
     funct(b, c, d); //Call the functor, minor calculations 
     return d[0]; 
    } 

    public static void main(String[] args) { 
     A a = new A(1); 
     double[] b = {2}; 
     double[] c = {3}; 
     double[] d = {4}; 
     double res = g(a.f, b, c, d); 
    } 
} 

換句話說,是否可以使用對象(或靜態方法)的特定方法作爲函數?如果是這樣,你能舉一個簡短的例子嗎?

函子表示具有一個數據成員(a)和一些額外的參數(B,C,d)工作的功能的說明...

+6

看起來你只是想把'a :: f'作爲一個方法引用,但是你現在只提供了僞代碼,這使得它很難幫助你。 –

+0

@ Jon:使用僞代碼是因爲我不知道正確的語法:-) – justik

+1

'funct'是實例,所以你不能像'funct(a,b,c)'那樣使用它,但是你可能想要使用它像'funct.calculate(a,b,c)'。你應該存儲/返回這種方法的結果。無論如何,爲了能夠在三個參數上調用'calculate',您需要具有可以接受這些參數的方法的功能接口。所以你需要類似'interface ThreeArrayFunction {double calculate(double [] a,double [] b,double [] c);}'。 – Pshemo

回答

0

我發現了以下解決方案。最初,創建界面■功能:

public interface IFunction { 
    double eval(double [] a, double [] b, double [] c) ; 
} 

A類仍然是:

public class A { 
    private double a; 

    public A(double a_) {a = a_;} 

    public void f(double[] b, double[] c, double[] d) { 
     d[0] = a * (b[0] + c[0]); 
    } 
} 

然而,B類使用函數指針:

public class B { 

    public double g(IFunction funct, double[] b, double[] c, double[] d) { 
    funct.eval(b, c, d); 
    return d[0]; 
    } 

    public static void main(String[] args) { 
    A a = new A(1); 
    double[] b = {2}; 
    double[] c = {3}; 
    double[] d = {4}; 

    double res = g(a::f, b,c, d); 
} 

我希望它有助於..也許有更好的解決方案:-)

+0

我不明白類A和IFunction接口之間的關係。是否意味着A實現了IFunction接口,將方法'f'重命名爲'eval'? – JohnC

0

另一種解決方案是使用現有的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獲取有關函數,它們始終只取一個參數,但返回的功能,以獲得仍下落不明參數的詳細信息。

+0

@ mrt181感謝您發送的解決方案。作爲一名C++程序員,我有點驚訝,Java語法可能會如此複雜:-)。 – justik

相關問題