【问题标题】:How to work with Collection objects to get desired Collection in Groovy如何使用 Collection 对象在 Groovy 中获得所需的 Collection
【发布时间】:2020-05-26 19:25:48
【问题描述】:

我对 Java 知之甚少,但对 groovy 知之甚少。通过使用我的一些常规知识并使用 groupBy 集合操作results.groupBy({ plan -> plan.planItem.self }) 达到以下结果,我得到了以下结果。

我想比较并获取以TEST-2 结尾的planItem.self URL 的最早startDate 和最新endDate。你可以看到TEST-2 有两个不同的startDateendDate 条目。我想要的最后一个对象是只有一个 TEST-2 条目,但日期如上所述,并删除除一个之外的所有对象。对于所有页面类似,例如AP-3AP-1。 我有一个如下所示的集合对象(您可能会注意到TEST-2AP-3 有多个对象)。

{
 "https://dev.example.com/pages/TEST-2": [
    {
      "startDate": "2020-05-16",
      "endDate": "2020-05-17",
      "planItem": {
        "self": "https://dev.example.com/pages/TEST-2",
        "type": "ISSUE"
      },
    },
    {
      "startDate": "2020-05-17",
      "endDate": "2020-05-20",
      "planItem": {
        "self": "https://dev.example.com/pages/TEST-2",
        "type": "ISSUE"
      }
    }
  ],
  "https://dev.example.com/pages/AP-3": [
    {
      "startDate": "2020-05-16",
      "endDate": "2020-05-17",
      "planItem": {
        "self": "https://dev.example.com/pages/AP-3",
        "type": "ISSUE"
      }
    },
    {
      "startDate": "2020-05-27",
      "endDate": "2020-05-27",
      "planItem": {
        "self": "https://dev.example.com/pages/AP-3",
        "type": "ISSUE"
      }
    }
  ],
  "https://dev.example.com/pages/AP-1": [
    {
      "startDate": "2020-05-16",
      "endDate": "2020-05-17",
      "planItem": {
        "self": "https://dev.example.com/pages/AP-1",
        "type": "ISSUE"
      }
    }
  ],
  "https://dev.example.com/pages/AP-4": [
    {
      "startDate": "2020-05-16",
      "endDate": "2020-05-18",
      "planItem": {
        "self": "https://dev.example.com/pages/AP-4",
        "type": "ISSUE"
      }
    }
  ]
}

我想要制作的输出对象如下所示(您可能会注意到,在输出集合中,TEST-2AP-3 只有一个对象)并且还删除了不必要的属性。请指导我使用最好的 Groovy 操作来加快整个过程,因为我只有 60 秒的时间来运行这些操作以及 REST 调用,一旦我以我想要的格式准备好这些对象,我就会进行这些调用,所以处理时间非常重要。

{
 "https://dev.example.com/pages/TEST-2": [
    {
      "startDate": "2020-05-16",
      "endDate": "2020-05-20"
    }
  ],
  "https://dev.example.com/pages/AP-3": [
    {
      "startDate": "2020-05-16",
      "endDate": "2020-05-27"
    }
  ],
  "https://dev.example.com/pages/AP-1": [
    {
      "startDate": "2020-05-16",
      "endDate": "2020-05-17"
    }
  ],
  "https://dev.example.com/pages/AP-4": [
    {
      "startDate": "2020-05-16",
      "endDate": "2020-05-18"
    }
  ]
}

日期应该从字符串转换为日期。

【问题讨论】:

    标签: json parsing data-structures groovy collections


    【解决方案1】:

    您已经有了 group-by 的基本结构。下一个想要的每个 映射值是所有 startDate 的最小值和所有 endDate 的最大值。例如。 这行得通:

    def data = new groovy.json.JsonSlurper().parse("data.json" as File)
    
    println(data.collectEntries{ url, plans ->
        [url, [startDate: plans*.startDate.min(), endDate: plans*.endDate.max()]]
    }.inspect())
    
    // → ['https://dev.example.com/pages/TEST-2':['startDate':'2020-05-16', 'endDate':'2020-05-20'], 'https://dev.example.com/pages/AP-3':['startDate':'2020-05-16', 'endDate':'2020-05-27'], 'https://dev.example.com/pages/AP-1':['startDate':'2020-05-16', 'endDate':'2020-05-17'], 'https://dev.example.com/pages/AP-4':['startDate':'2020-05-16', 'endDate':'2020-05-18']]
    

    这将创建一个新地图,保留原始密钥并创建一个新地图 列表中的值,其中所有 startDate:s 都被收集(通过价差 运算符),然后从中获取最小值(作为日期的字符串已经 很好地排序)。 endDate 与最大值相同。

    【讨论】:

    • 你能解释一下这个plans*.startDate.min()部分吗?
    • “收集所有 startDate:s 的位置(通过扩展运算符),然后从中获取最小值” - plans.collect{ it.startDate }.min() 的缩写 - 从计划中获取所有 startdate,然后获取最小值那个。
    • 感谢您的解释和中肯的回答。我可以通过上面的 sn-p 实现我想要实现的目标。
    • 在运行 min() 或 max() 之前,我想使用例如 Date.parse() 将这些 startDate 和 endDate 字符串值转换为日期值。我怎样才能在同一个 collectEntries 中做到这一点?因为在字符串日期列表上运行 max() 会给出错误的最大日期。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多