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