Как dep я могу собирать значения атрибутов в список списка с лямбда? - PullRequest
0 голосов
/ 06 июня 2018

У меня есть Объект с этой структурой:

public class CategoryDTO {

    @JsonProperty("id")
    private Long id;

    @JsonProperty("parentId")
    private Long parentId;

    @JsonProperty("name")
    private String nameCategory;

    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private ComissaoPadraoEntity comission;

    @JsonProperty("categories")
    private List<CategoriaDTO> subcategories;

Я делаю этот метод:

public Map<Long, List<Long>> mapATreeOfCategories(List<CategoryDTO> categories) {
        Map<Long, List<Long>> treeCategories = categoires.stream()
                .collect(Collectors.toMap(c -> c.getId(),
                        v -> v.getCategories().stream()
                                .map(e -> e.getId()).collect(Collectors.toList())));
        return treeCategories;

У меня есть две проблемы здесь, первый Te возвращает это:

"1813": [1827,1830,1839,1834,1706,1822,2239,1835,2400,3290,3355,3319],...

OBS: они только обозначают уровень как ключ, а второй - как значение.Он даже рассматривает третий уровень.

если вы посмотрите на приведенную ниже структуру, мне нужно, чтобы возврат пришел следующим образом:

"1813":[1813]

"1827":[1827,1813]

"1830":[1830,1827,1813]

"1831":[1831,1830,1827,1813]



<!--Payload-->
      {
          "categories": [
            {
              "id": "1813",
              "parentId": null,
              "name": "Malas e Mochilas",
              "items": 12,
              "categories": [
                {
                  "id": "1827",
                  "parentId": "1813",
                  "name": "Conjuntos de Malas",
                  "items": 0,
                  "categories": [

                  ],
                  "attributes": null
                },
                {
                  "id": "1830",
                  "parentId": "1813",
                  "name": "Mochilas",
                  "items": 4,
                  "categories": [
                    {
                      "id": "1831",
                      "parentId": "1830",
                      "name": "Mochila Esportiva",
                      "items": 0,
                      "categories": [

                      ],

и второй, я знаю, что этот объект имеет только три уровня, но в будущем, если появится еще один уровень, я хочу предотвратить это.

Я хочу знать, есть ли способ сделать этот метод с лямбда-выражением, как может пройти dep один поиск с лямбда-выражением.Или единственный способ с базовым для каждой структуры?

Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

По сути, вы изучаете что-то, что реализует глубокий обход, а затем выплевывает стек идентификаторов при переходе к следующей рекурсии.Это может быть лучше всего реализовано с использованием обычной рекурсии (если не слишком глубоко) или итеративной версии с использованием структуры данных стека, чтобы сохранить стек идентификаторов при перемещении по обходу.

Псевдокод:

final Map<Integer, List<Integer>> categoriesMaps(final JsonNode node, final Stack<Integer> parentIds, final Map<Integer, List<Integer>> dest) {
    dest.put(node.categoryId, new ArrayList<>(parentIds));
    parentIds.push(node.categoryId)
    for (final Node child : node.children()) {
        categoriesMaps(child, parentIds, dest);
    }
    parentIds.pop(); // removes node.categoryIds
}

Я не думаю, что это лучшее использование лямбда / потока, особенно если максимальная глубина неизвестна во время компиляции и может варьироваться между "листами"Я БЫ.

Возможно, лучший способ добиться этого с помощью stream - создать собственный Spliterator, который бы создавал требуемый поток пар LeafIds -> parentIDStackList, которые затем можно собрать в карту, если вы этого хотите.

0 голосов
/ 06 июня 2018
private void associarCategorias(List<CategoriaDTO> categorias, Map<Long, List<Long>> arvoreDeCategorias) {
        categorias.forEach(departamento -> {
            arvoreDeCategorias.put(departamento.getCodigoCategoria(), Arrays.asList(departamento.getCodigoCategoria()));

            if (!ObjectUtils.isEmpty(departamento.getSubCategorias()) || !departamento.getSubCategorias().isEmpty()) {
                departamento.getSubCategorias().forEach(categoria -> {
                    arvoreDeCategorias.put(categoria.getCodigoCategoria(),
                            Arrays.asList(categoria.getCodigoCategoria(), departamento.getCodigoCategoria()));

                    if (!ObjectUtils.isEmpty(categoria.getSubCategorias()) || !categoria.getSubCategorias().isEmpty()) {
                        categoria.getSubCategorias().forEach(subCategoria -> {
                            arvoreDeCategorias.put(subCategoria.getCodigoCategoria(),
                                    Arrays.asList(subCategoria.getCodigoCategoria(), categoria.getCodigoCategoria(), departamento.getCodigoCategoria()));
                        });
                    }
                    return;
                });
                return;
            }
            associarCategorias(departamento.getSubCategorias(), arvoreDeCategorias);
        });
    }
...