java - Groovy Map<String,List<Map<String,String>>> 数据操作

标签 java optimization groovy

正在尝试更新 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

我正在尝试实现下面的 map 如果错误消息没有行号,则需要将其附加在顶层,如 invLineItems.put('error',['INV-Error_Test1' :文件错误:文件格式不受支持 ]) 否则,错误消息应附加到匹配的 INVOICE 和行号,如下所示

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 方法简化代码

最佳答案

对我来说,它看起来足够时髦了:-)除非你想变得 super 时髦。

但是你可以写这样的东西:

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("|")}
    }
}

基本上,我在这里尝试使用一些正则表达式运算符,也专门使用each形式进行迭代,使用as关键字进行类型转换。没什么特别的。是的,我去掉了所有的分号。

关于java - Groovy Map<String,List<Map<String,String>>> 数据操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29405698/

相关文章:

c++ - 如何强制编译器发出去虚拟化代码

java - Groovy SQL 导入错误。即使包含在内也找不到属性

java - 在 Apache Camel 中修改主体的最佳方法?

groovy - Groovy 中奇怪的除法运算符

java - PreparedStatement.setString() 方法不带引号

html - 从我的所有网站页面中删除 HTML 部分块会影响 SEO 和我的网站排名吗?

java - 如何在Java中对Spark DataFrame应用字符串操作

linux - 解压缩 bz2 文件

java - 如何避免在 hibernate 中更新父对象时更新子对象?

java - 如何在运行时更改 ATM 类(Java 反射)