Java8 lambda顺序或管道字符串转换

时间:2016-10-17 14:34:41

标签: java lambda java-8

我在基于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

2 个答案:

答案 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 时髦的这些都是!