簡體   English   中英

Java8 Lambda順序或管道字符串轉換

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM