2015-04-17 24 views
3

首先,我們必須在其他文件或同一個文件中爲lambda表達式聲明接口。但是如果我們可以在方法聲明中做到這一點,將會更容易。反正呢?我們如何在Lambda表達式中創建它?

public class LambdaAppJava8 { 
public int fonk(
    int a, 
    int b, 
    interface MyInterface{ 
      public int call(int a, int b); 
    } anonim 
) { 
    return anonim.call(a, b); 
} 

public static void main(String[] args) { 
    LambdaAppJava8 app = new LambdaAppJava8(); 
    System.out.println(app.fonk(1, 3, (c, d) -> c + d)); 
} 
} 
+0

你想達到什麼目的?我爲此添加了java-8標記。 – Nirmal

+0

您加入我接受了。有什麼不對? – Sarkhan

回答

3

沒有辦法在方法聲明中聲明一個接口,但你可以使它成爲一個足夠接近的嵌套類型。

public class LambdaAppJava8 { 
    private interface MyInterface { 
     public int call(int a, int b); 
    } 
    public int fonk(int a, int b, MyInterface anonim) { 
     return anonim.call(a, b); 
    } 
    public static void main(String[] args) { 
     LambdaAppJava8 app = new LambdaAppJava8(); 
     System.out.println(app.fonk(1, 3, (c, d) -> c + d)); 
    } 
} 

似乎也有以匿名interface的含義的誤解。您可以在方法內聲明匿名類,但這些類不是「即時」聲明的;它們仍然是在編譯時創建的類型,它們自己的類文件不小於頂級類型,實際上,它恰恰相反。這些類型比頂級類型具有更大的類文件,因爲它們包含關於定義它們的周圍環境的元信息。

如果有方法在方法的參數列表中聲明interface,則不會改變;它不會比在其他任何地方聲明效率更高。但是它需要特殊的作用域規則異常,因爲在正常的作用域規則下,由於調用者不知道該類型,因此不能調用期望方法本地類型的參數的方法。


但是請注意,上面的例子是你想要實現的。您還可以將MyInterface的聲明更改爲public,其他類可以使用lambda表達式調用方法,如使用案例app.fonk(1, 3, (c, d) -> c + d),而無需導入MyInterface。這是你的問題似乎是關於什麼,調用者不必處理專門爲fonk參數定義的interface,編譯器會這樣做。

1

不,沒有辦法在java中這樣做,您不能在方法減速中聲明匿名類/接口。

如果你正在尋找一個特定場景的解決方案,那麼我建議:

public int fonk(
    int a, 
    int b, 
    BiFunction<Integer, Integer, Integer> anonim 
) { 
    return anonim.apply(a, b); 
} 

據:BiFunction

+0

謝謝answer.this解決方案是spesific.not common.i不能聲明其他類型的變量,超過3等 – Sarkhan

+0

然後,你需要聲明另一個頂級接口與你想要的變量。 –

+0

另外['IntBinaryOperator'](http://docs.oracle.com/javase/8/docs/api/java/util/function/IntBinaryOperator.html)。 – Radiodef

0

你可以做到這一點

import java.util.function.BiFunction; 


public class LambdaAppJava8 { 
    public static int fonk(int a, int b,int c, 
      BiFunction<Integer,Integer,Integer> func 
     ) { 
      return func.apply(func.apply(a, b),c); 
     } 
    public static void main(String[] arg){ 
     int sum = fonk(1,2,3,(x,y)->x+y); 
     int product = fonk(1,2,3,(x,y)->x*y); 
     System.out.println(sum); 
     System.out.println(product); 
    } 
} 
相關問題