В настоящее время я использую Java 8 и не могу переключиться на более поздние версии. Поскольку я не мог найти ничего подобного, возможно, кто-то знает уже реализованное решение. Это может быть сторонняя библиотека или использование лямбды и т. Д. Никаких ограничений. Любая помощь приветствуется!
Существует список с этой структурой, например:
| ID | Date | Status | Name | Description | Currency |
|----|------------|--------|------|------------------|----------|
| 1 | 2019-10-01 | 1 | 'A' | 'Description A' | USD |
| 1 | 2019-10-01 | 3 | 'A' | 'Description A2' | USD |
| 1 | 2019-10-01 | 4 | 'A2' | 'Description A2' | USD |
| 2 | 2019-10-03 | 1 | 'B' | 'Description B' | USD |
| 2 | 2019-10-03 | 2 | 'B' | 'Description B' | BRL |
| 2 | 2019-10-03 | 4 | 'B' | 'Description B' | USD |
| 3 | 2019-10-05 | 1 | 'C' | 'Description C' | JPY |
| 3 | 2019-10-05 | 2 | 'C' | 'Description C2' | JPY |
Проблема заключается в создании другого списка на основе исходного списка с полями:
- Дата;
- ID;
- Время Статус изменен;
- Время Имя или описание изменены;
- Время Валюта изменена;
Кроме того, требуются дополнительные поля (если это делает вопрос слишком сложным, я могу разделить его на другие вопросы):
Дни между датой последнего изменения и первой датой определенного идентификатора (что называется «старением»);
Отображение типа изменений:
7.1 «Имя / Описание», если только имя ИЛИ описание изменено
7.2 «Валюта», если изменена только валюта
7.3 «Оба», если имя или описаниеИ валюта изменена
Не обязательно быть List
. Это может быть любой тип коллекции.
Первый список происходит из запроса SQL. Вот что я начал писать:
public List<Obj> getResultList() {
List<Obj> resultList = new ArrayList<>();
Map<String, Integer> counterMap = new HashMap<>();
counterMap.put("status", 0);
counterMap.put("name", 0);
counterMap.put("description", 0);
counterMap.put("currency", 0);
StreamEx.of(sourceList).forPairs((current, next) -> {
compareCurrentAndNext(current, next);
});
int countStatus = counterMap.get("status");
// etc
}
private void compareCurrentAndNext(final Obj current,
final Obj next) {
if (current.getId().equals(next.getId())) {
if (!current.getStatus().equals(next.getStatus())) {
counterMap.replace("status", counterMap.get("status") + 1);
}
// etc
}
}
Он использует библиотеку StreamEx (https://github.com/amaembo/streamex):
<dependency>
<groupId>one.util</groupId>
<artifactId>streamex</artifactId>
<version>0.7.0</version>
</dependency>
На самом деле, есть еще много атрибутов, и я упростил реальную проблему здесь.