我是java8的新手,我試圖理解這段代碼。這是一段代碼:Stream.of("A", "B", "C").anyMatch(someObj.getStringValue()::equalsIgnoreCase)someObj.getStringValue()引用某個對象并getStringValue()返回某個字符串值。傳入的方法引用的等效謂詞是什么anyMatch(...)?我的理解是這相當于:Predicate<String> p = new Predicate<String>() { @Override public boolean test(String t) { return someObject.getStringValue().equalsIgnoreCase(t); }}Stream.of("A", "B", "C").anyMatch(p)這樣我得到錯誤“someObject在封閉范圍中定義的局部變量必須是最終的或有效的最終”。任何對此的解釋都值得贊賞。
1 回答

桃花長相依
TA貢獻1860條經驗 獲得超8個贊
該someObj.getStringValue()表達式在外部求值,因此等效代碼為:
final String x = someObject.getStringValue();
Predicate<String> p = new Predicate<String>() {
@Override
public boolean test(String t) {
return x.equalsIgnoreCase(t);
}
}
Stream.of("A", "B", "C").anyMatch(p)
其中局部變量x也是“匿名”的。
因此,someObject不需要是有效的最終的。
您可以通過在調試器中放置斷點來驗證lambda 表達式getStringValue()的此行為。即使該test()方法被調用 3 次(因為流有 3 個元素,并且假設沒有匹配項),該getStringValue()方法也只會被調用一次。
添加回答
舉報
0/150
提交
取消