Java 8 Copy Map с фильтром другой карты - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь отфильтровать оригинальную карту, сравнивая ее с картой условий, в которой есть только наборы ключей с идентификатором. Основываясь на карте условий, я хочу отфильтровать от исходной карты.

Оригинальная карта, которая у меня есть,

Map<Integer, AppFeatureDTO> appFeatureMap = new TreeMap<>();

, что приведет к,

{
    "101": {
        "id": 101,
        "subFeature": {
            "1": {
                "id": 1,
                "title": "Title Value",
                "desc": "Description Value"
            }
        }
    },
    "102": {
        "id": 102,
        "subFeature": {
            "1": {
                "id": 1,
                "title": "Title Value",
                "desc": "Description Value"
            }
        }
    },
    "103": {
        "id": 103,
        "subFeature": {
            "1": {
                "id": 1,
                "title": "Title Value",
                "desc": "Description Value"
            },
            "2": {
                "id": 2,
                "title": "Title Value",
                "desc": "Description Value"
            },
            "3": {
                "id": 3,
                "title": "Title Value",
                "desc": "Description Value"
            },
            "4": {
                "id": 4,
                "title": "Title Value",
                "desc": "Description Value"
            }
        }
    }
}

и соответствующие классы:

class AppFeatureDTO {
    private int id;
    private Map<Integer, AppSubFeatureDTO> subFeature;
}
class AppSubFeatureDTO{
    private int id;
    private String title;
    private String description;
}

тогда у меня есть карта фильтра,

Map<Integer, FeatureDTO> conditionFilterMap = new TreeMap<>();

который в результате, как,

{
    "101": {
        "id": 101,
        "subFeature": {
            "1": {
                "id": 1,
            }
        }
    },
    "103": {
        "id": 103,
        "subFeature": {
            "2": {
                "id": 2
            },
            "4": {
                "id": 4
            }
        }
    }
}

соответствующие классы для карты фильтра:

class FeatureDTO {
    private int id;
    private Map<Integer, SubFeatureDTO> subFeature;
}
class SubFeatureDTO{
    private int id;
}

Я хочу отфильтровать карту результатов с помощью условия conditionFilterMap,

{
"101": {
    "id": 101,
    "subFeature": {
        "1": {
            "id": 1,
            "title": "Title Value",
            "desc": "Description Value"
        }
    }
},
"103": {
    "id": 103,
    "subFeature": {
        "2": {
            "id": 2,
            "title": "Title Value",
            "desc": "Description Value"
        },
        "4": {
            "id": 4,
            "title": "Title Value",
            "desc": "Description Value"
        }
    }
}

}

Я использую Spring ModelMapper для копирования AppFeatureDTO в FeatureDTO. Но, отфильтровав карту, я не понял.

Не могли бы вы подсказать, как получить resultMap с помощью Java 8?

Даже я не мог представить себе простое решение с использованием Java 7 или 6.

1 Ответ

1 голос
/ 30 марта 2019

Предполагая, что ключ карты совпадает с полем id:

Map<Integer, AppFeatureDTO> resultMap = conditionFilterMap.values().stream()
        .map(FeatureDTO::getId)
        .map(appFeatureMap::get)
        .collect(Collectors.toMap(AppFeatureDTO::getId, a -> new AppFeatureDTO(a.getId(),
                conditionFilterMap.get(a.getId()).getSubFeature().values().stream()
                        .map(SubFeatureDTO::getId)
                        .map(a.getSubFeature()::get)
                        .collect(Collectors.toMap(AppSubFeatureDTO::getId, x -> x)))));

Если вам нужно TreeMap, добавьте аргументы (a, b) -> a, TreeMap::new к вызовам Collectors.toMap.

Не потоковая версия на самом деле выглядит не хуже:

Map<Integer, AppFeatureDTO> resultMap = new TreeMap<>();
for (FeatureDTO f : conditionFilterMap.values()) {
    AppFeatureDTO a = appFeatureMap.get(f.getId());
    Map<Integer, AppSubFeatureDTO> resultSub = new TreeMap<>();
    for (SubFeatureDTO s : f.getSubFeature().values()) {
        resultSub.put(s.getId(), a.getSubFeature().get(s.getId()));
    }
    resultMap.put(a.getId(), new AppFeatureDTO(a.getId(), resultSub));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...