【发布时间】:2013-11-22 21:09:05
【问题描述】:
我想编写一个函数,它可以将字符串与正则表达式匹配,并以所有组匹配作为参数执行回调。
我想出了这个并且它有效:
private static void parse(String source, String regex,
Consumer<String[]> callback) {
//convert regex groups 1..n into integer array 0..n-1 and call
//consumer callback with this array
Matcher m = Pattern.compile(regex).matcher(source);
String[] ret = new String[m.groupCount()];
if (m.matches()) {
for (int i=0; i<m.groupCount(); i++) {
ret[i] = m.group(1+i);
}
callback.accept(ret);
}
}
你可以这样做
parse("Add 42,43", "Add (\\d+?),(\\d+?)", p -> processData(p[0],p[1]));
我最想做的就是这样
parse("Add 42,43", "Add (\\d+?),(\\d+?)", (x,y) -> processData(x,y));
什么是最优雅的方式?我唯一能想到的就是用 1..n 参数声明多个功能接口,并使用覆盖来处理它。有没有更好的想法,也许需要反思?
【问题讨论】:
-
我不完全确定你在追求什么,但似乎 varargs 和 lambda 不能以你想要的方式混合。为了使用 lambda,目标类型必须是函数式接口,其单个方法具有固定数量的参数,在编译时确定。问题的根源在于直到运行时才知道正则表达式中有多少组。如果只有一组,如何调用
processData,因为它似乎需要两个参数? -
实际上,我认为,调用者确实知道正则表达式中有多少组,并且方法覆盖的想法可能有效。只是没有一种方法。