我在基于JCR的应用程序上工作,当我的查询包含非法字符时,我的查询会中断。
所以我承担了一个非常简单的任务:给出一个查询字符串和一个包含" dodgy"的列表的地图。字符,依次用允许的字符替换那些狡猾的字符。我想使用lambdas,可悲的是有点卡住了:
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
答案 0 :(得分:5)
问题是您正在访问lambda表达式主体范围内的局部变量query
。因此,它必须是final
或有效final
。但是,将query
声明为final
无法解决问题,因为您要为其分配值。
我建议你让方法replaceCharacter
使用StringBuilder
并让它替换内容,而不是阅读和重新分配String
变量。
答案 1 :(得分:0)
感谢有用的回复和评论,好人。 是的,我开始深入挖掘 - 并尝试使用StringBuilder,但由于我需要替换字符串中的所有发生,所以很快就会升级为10行代码和另一个嵌套循环。
因此,不是降低复杂性和提高代码可读性,而是正好相反。
与无lambda的比较:
private String sanitizeQueryString(String query){
for (String key: DODGY_CHARS.keySet()){
query = replaceCharacter(query, key, DODGY_CHARS.get(key));
}
return query;
}
很好很简单,是吗?
经验教训:不管怎样,都不要试图将所有东西都称为lambda 时髦的这些都是!