我尝试使用invoiceErrors更新Map<String,List<Map<String,String>>> invoices
,如下所示
InvoiceError // is an entity with below attributes
{ String errorMessage,
String invoiceNumber
}
ErrorMessage invoiceNumber
------------- -------------------
File Error : The file is in an unsupported format INV-Error_Test1
Line : 1 Invoice does not foot Reported INV-Error_Test1
Line : 2 MATH ERROR INV-Error_Test1
Line : 3 MATH ERROR INV-Error_Test2
Line : 3 Invoice does not foot Reported INV-Error_Test2
我试图在下面的地图上实现
如果错误消息没有行号,则需要在顶层附加invLineItems.put('error',['INV-Error_Test1' :
文件错误:文件格式不受支持])
否则,错误消息应附加到匹配的INVOICE和linenumber,如下所示
invLineItems = [INV-Error_Test1:[[LINE:1, INVOICE_DATE:20150301, INVOICE_NUMBER:INV-Error_Test1, INVOICE_TOTAL:22, error : `Line : 1 Invoice does not foot Reported`],
[LINE:2, INVOICE_DATE:20150301, INVOICE_NUMBER:INV-Error_Test1, INVOICE_TOTAL:24, error : `Line : 2 MATH ERROR`],
INV-Error_Test2:[[LINE:3, INVOICE_DATE:20150301, INVOICE_NUMBER:INV-Error_Test2, INVOICE_TOTAL:26, , error : `Line : 3 MATH ERROR | Line : 3 Invoice does not foot Reported`],
[LINE:4, INVOICE_DATE:20150301, INVOICE_NUMBER:INV-Error_Test2, INVOICE_TOTAL:28,]],
error : [[INV-Error_Test1:`File Error : The file is in an unsupported format`]]
我写了下面的方法来实现上面的
def regex = "^Line\\s(?:(\\d+)\\s)?\\s*:\\s+(\\d+)?.+";
for (e in invLineItems ){
def errors = lipErrors.findAll{it.invoiceNumber==e.key} // finding the error messages with the invoice number
errors.each{ // fetching the line numbre from error message and finding the matching record the invoice number and line number in invLineItems
int lineNumber
if (it.errorMessage.matches(regex)) {
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher(it.errorMessage);
if (m.find()) {
lineNumber = Integer.parseInt(m.group());
}
println "lineNumber = "+lineNumber
}
if(e.value['LINE_ITEM_NUMBER'].find{it==lineNumber.toString()}) {
def data = lipErrors.findAll{it.invoiceNumber==e.key && it.errorMessage.matches("^Line\\s+"+lineNumber+"?\\:\\s+"+lineNumber+"?.+")}
e.getValue().each{it.put("error", data.errorMessage.join("|"))}
}
}
}
代码看起来不像Groovy并且主要使用传统的java代码,我想知道是否可以使用Groovy方法简化代码
答案 0 :(得分:1)
看起来Groovy对我来说足够了:-)除非你想成为超级常规。
但是你可以这样写:
def regex = /^Line\s(?:(\d+)\s)?\s*:\s+(\d+)?.+/
invLineItems.each {e->
int lineNumber
if (it.errorMessage ==~ regex) {
Matcher m = it.errorMessage =~ /\d+/
if (m.find()) {
lineNumber = m.group() as Integer
}
println "lineNumber $lineNumber"
}
if(e.value['LINE_ITEM_NUMBER'].find{it==lineNumber.toString()}) {
def data = lipErrors.findAll{it.invoiceNumber==e.key && it.errorMessage ==~ Pattern.compile("^Line\\s+"+lineNumber+"?\\:\\s+"+lineNumber+"?.+")}
e.value.each{it['error'] = data.errorMessage.join("|")}
}
}
基本上我在尝试使用一些正则表达式运算符,也只使用每个表单进行迭代,使用as关键字进行类型转换。没什么特别的。是的,我摆脱了所有的分号。