我想知道 java lambda 函式是否總是唯一的?如果是,是什么讓它與眾不同?
在這個偽代碼中,我有兩個帶有一些代碼但不相等的消費者,并且 hashCodes 也是不同的。
Consumer<String> c1 = s -> {
System.out.println(s);
};
Consumer<String> c2 = s -> {
System.out.println(s);
};
System.out.println(c1.hashCode());
System.out.println(c2.hashCode());
System.out.println(c1.equals(c2)); // false: is it always false?
我想在一個集合中存盤一個 lambda 串列,我不確定如果我偶然得到了兩個具有相等 hashCodes 的 lambda 函式,我是否會丟失一些元素。
uj5u.com熱心網友回復:
根據JLS 15.27.4(強調我的):
lambda 運算式的值是對具有以下屬性的類實體的參考:
- [...]
- 該類不覆寫目標功能介面型別或上述其他介面型別的其他方法,盡管它可能會覆寫
Object
該類的方法。
由于它說“可能”,因此 lambda 的類可能具有equals
&的自定義實作hashCode
,也可能沒有,具體取決于實作。
另請注意:
這些規則旨在為 Java 編程語言的實作提供靈活性,因為:
不需要在每次評估時都分配一個新物件。
由不同 lambda 運算式生成的物件不必屬于不同的類(例如,如果主體相同)。
評估產生的每個物件不必屬于同一個類(例如,捕獲的區域變數可能是行內的)。
如果“現有實體”可用,則不必在先前的 lambda 評估中創建它(例如,它可能已在封閉類的初始化期間分配)。
一個實作可能會看到您的兩個 lambda 具有相同的主體,并為您的 lambda 生成一個類。equals
可以重寫該類的方法以回傳true
任何同時也是該類的實體的物件。它甚至可以為你的兩個 lambdas 使用相同的物件!在任何一種情況下,如果您將兩個 lambdas 添加到您的集合中,您的集合將只有一個元素。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/434494.html
下一篇:使用掃描儀讀取檔案時如何處理空格