Как работать с объектами Коллекции, чтобы получить желаемую Коллекцию за Groovy - PullRequest
0 голосов
/ 26 мая 2020

Я немного знаю Java, но не знаю groovy. Я получил результат ниже, используя некоторые из моих groovy знаний и использовал операцию сбора groupBy results.groupBy({ plan -> plan.planItem.self }), чтобы достичь этого.

Я хочу сравнить и получить самые ранние startDate и последние endDate для URL-адреса planItem.self, заканчивающегося на TEST-2. Вы можете видеть, что TEST-2 имеет 2 записи с разными startDate и endDate. Последний объект, который я хочу, имеет только одну запись TEST-2, но даты, как указано выше, и удаление всех объектов, кроме одного. Аналогично для всех страниц типа AP-3, AP-1. У меня есть объект коллекции, как показано ниже (вы можете заметить, что есть несколько объектов для TEST-2 и AP-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-2 и AP-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"
    }
  ]
}

Даты должны быть преобразованы из String в date.

1 Ответ

2 голосов
/ 26 мая 2020

У вас уже есть базовая c структура из вашей группы. Затем нужно для каждого значения карты минимум всех 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 с максимумом.

...