[英]Java8 lambda sequential or piped String transformation
我在基於JCR的應用程序上工作,當查詢中包含非法字符時,查詢就會中斷。
因此,我完成了一個非常簡單的任務:給定一個查詢字符串和一個包含“狡猾”字符列表的映射,依次用允許的字符替換那些狡猾的字符。 我想使用lambda,但有點卡住了:
public static Map<String, String> DODGY_CHARS = getDodgyCharMapping();
static Map<String, String> getDodgyCharMapping(){
Map<String, String> map = new HashMap<>();
map.put("'", "''");
return map;
}
private String sanitizeQueryString(String query){
DODGY_CHARS.keySet().forEach(key->{
query = replaceCharacter(query, key, DODGY_CHARS.get(key));
});
return query;
}
lambda內部的查詢變量是J8不滿意的,導致出現以下錯誤:
error: local variables referenced from a lambda expression must be final or effectively final
問題在於您正在lambda表達式主體的范圍內訪問局部變量query
。 因此,它必須是final
或實際上是final
。 但是,將query
聲明為final
並不能解決問題,因為您正在為其分配值。
我建議您讓方法replaceCharacter
使用StringBuilder
並讓它替換內容,而不是讀取並重新分配String
變量。
感謝有用的答復和評論,好人。 是的,我開始更深入地研究-並嘗試使用StringBuilder,但是由於我需要替換字符串中的所有出現,因此需要使用另一個嵌套循環將其迅速升級為10多行代碼。
因此,與其相反,不是降低復雜性和提高代碼的可讀性。
與無lambda比較:
private String sanitizeQueryString(String query){
for (String key: DODGY_CHARS.keySet()){
query = replaceCharacter(query, key, DODGY_CHARS.get(key));
}
return query;
}
很簡單,對吧?
經驗教訓:不管這些鞋有多時尚,都不要試圖像拉姆達一樣shoe腳!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.