回答
總結的情況下,the link Jon posted它曾經出現故障,「SAM」代表「單一抽象方法」和「SAM型」是指接口,如Runnable
,Callable
等Lambda表達式,一個新的功能在Java中8 ,被認爲是SAM類型,可以自由轉換爲它們。
例如,像這樣的接口:
public interface Callable<T> {
public T call();
}
可以聲明一個Callable
使用lambda表達式是這樣的:
Callable<String> strCallable =() -> "Hello world!";
System.out.println(strCallable.call()); // prints "Hello world!"
在這種情況下Lambda表達式大多隻是語法糖。它們在代碼方面比匿名類更好,而且對方法命名的限制更少。從鏈接拿這個例子:
class Person {
private final String name;
private final int age;
public static int compareByAge(Person a, Person b) { ... }
public static int compareByName(Person a, Person b) { ... }
}
Person[] people = ...
Arrays.sort(people, Person::compareByAge);
使用不共享相同的名稱Comparator.compare
具體的方法這將創建一個Comparator
,這樣你就不必遵循的方法的接口命名,你可以在一個類中有多個比較覆蓋,然後通過lambda表達式即時創建比較器。
不斷深入...
在更深的層面,Java的使用這些Java 7中我說加invokedynamic
字節碼指令實現早些時候宣佈一個lambda創建的Callable
或Comparable
類似一個實例來的匿名類,但這並非嚴格爲真。相反,第一次調用invokedynamic
時,它會使用LambdaMetafactory.metafactory
method創建一個Lambda函數處理程序,然後在將來調用Lambda時使用此緩存實例。更多信息可以在this answer找到。
這種方法是複雜的,甚至包括代碼,可以直接從堆棧存儲器中讀出的原始值和引用傳遞到您的LAMBDA代碼(例如繞過需要分配一個Object[]
陣列來調用你的LAMBDA),但它允許未來迭代的Lambda實現可以替代舊的實現,而不必擔心字節碼兼容性。如果Oracle的工程師在較新版本的JVM中更改基礎Lambda實現,則在舊JVM上編譯的Lambdas將使用較新的實現。
作爲旁註,鏈接上的語法已過時。查看Lambda Expressions Java Trail以查看當前的語法。
- 1. Java - SAM類型優化
- 2. 什麼是Java中的文字類型?
- 3. 什麼是不同類型的java類?
- 4. 什麼是Java的多類型轉換的目的是什麼?
- 5. 什麼樣的Java類型是「[B」?
- 6. 什麼是抽象數據類型?它是Java中的類嗎?
- 7. 什麼是Java類型long long
- 8. 什麼是Java泛型中的類型擦除?
- 9. 什麼是oracle數據類型raw的java類型等價物?
- 10. 在Java中調用的這個類(類型)是什麼?
- 11. 什麼是?類型?
- 12. 什麼是類型和什麼是類型構造函數scala
- 13. DataGridAutoGeneratingColumnEventArgs.PropertyDescriptor是什麼類型的?
- 14. LetterP的類型是什麼?
- 15. 什麼是setContentView()的類型
- 16. 什麼是MouseEventArgs.X的類型?
- 17. T的類型是什麼?
- 18. 什麼是java泛型中的`AnyType`
- 19. 什麼是Java的類<X>類型的C#等價物?
- 20. 什麼是Scala的Java類類型的模擬,例如讓Foo.class?
- 21. java中通用類型實現的返回類型應該是什麼
- 22. Java中C的這些等效數據類型是什麼?
- 23. 什麼是在Java中的類型轉換?
- 24. Java中兩種類型的內存泄漏是什麼?
- 25. 什麼是java struts.xml中的差異路徑類型?
- 26. 在Java 7 multicatch塊中捕獲異常的類型是什麼?
- 27. 什麼是Java中「java.lang.Enum」類型對象的身份和狀態?
- 28. 這是什麼類型的對象在Java中?
- 29. 什麼是haskell中的類型變量/ Java
- 30. 什麼是Java中的'模糊類型'錯誤?
請參閱http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-3.html(這是我在一次搜索後發現的,它將我帶到另一個SO問題)。 –
這就是我所需要的。謝謝!出於好奇,你在搜索中使用了哪些關鍵字? – Cody
請不要引用人員過時的信息。稍微長一點的搜索會讓你看到更新的版本:http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-4.html,它本身是18個月大,現在在許多地方已經過時了。OP的問題在http://www.lambdafaq.org/what-is-a-functional-interface/上有答案,常見問題解答中的一頁,我試圖瞭解最新的情況,直到最近一次快速變化語言和API開發。 –