Создать список составления путем сопоставления полей между списком карт и списком объектов с использованием лямбда-функций? - PullRequest
2 голосов
/ 25 марта 2019

Я новичок в лямбда-выражениях Java и столкнулся со следующей проблемой:

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

[
    {
        "objectid": 10,
        "eventsourceid": 6,
        "fieldid": "ACQUIRE"
    },
    {
        "objectid": 13,
        "eventsourceid": 6,
        "fieldid": "HASSVALIM"
    }
]

Список карт имеет следующую структуру

[
    {
        "ACQUIRE": "1.42541559",
        "PERMCONVERGENT": "CaSPC3",
        "PVP": 133.88,
        "HASSVALIM": "67A4",
        "LASTUPDATE": "2018-10-10T13:38:11.000Z"            
    },
    {
        "ACQUIRE": "2.1327",
        "PERMCONVERGENT": "Calp3",
        "PVP": 23.18,
        "HASSVALIM": "1A24",
        "LASTUPDATE": "2018-10-10T13:38:11.000Z"            
    },
    {
        "ACQUIRE": "1.12459",
        "PERMCONVERGENT": "CaSPC3",
        "PVP": 33.58,
        "HASSVALIM": "653",
        "LASTUPDATE": "2018-10-10T13:38:11.000Z"            
    },
]

Я хочу извлечь из Списка карт только значения, требуемые в первом Списке ( fieldid ), и сгенерировать Список для последующего генерирования CSV, поэтому появление моего желаемого Списка будет:

{
    [1.42541559, 67A4],
    [2.1327, 1A24],
    [1.12459, 653],

}

Я получил желаемый результат итерации следующим образом.

    List<Map<String, Object>> dataMapList = this.getTableMap();
    List<CatalogLabel> columnsLabel = this.getCatalogtypelabel(objectid);

    List<String[]> body = new ArrayList<>();
    for(Map<String,Object> map:dataMapList) {
        String[] row = new String[columnsLabel.size()];
        int index=0;
        for(CatalogLabel label:columnsLabel) {
            if(map.containsKey(label.getFieldid())) {
                row[index++] = map.get(label.getFieldid()).toString();
            }
        }
        body.add(row);
    }

Интересно, можно ли получить другой результат, используя лямбда-выражения (поток, фильтр, сбор, отображение и т. Д.).

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Это эквивалентно использованию потоков:

List<String[]> body = dataMapList.stream()
        .map(d -> columnsLabel.stream()
                .map(CatalogLabel::getFieldid)
                .map(d::get)
                .map(Object::toString)
                .toArray(String[]::new))
        .collect(Collectors.toList());
0 голосов
/ 25 марта 2019

Возможный подход с Stream может быть

final List<List<String>> collect =
    dataMapList.stream()
               .map(map ->
                    columnsLabel.stream()
                                .map(cl -> cl.getFieldid())
                                .map(id -> String.valueOf(map.get(id)))
                                .collect(Collectors.toList())
               ).collect(Collectors.toList());

Какие выходы

[
  [1.42541559, 67A4], 
  [2.1327, 1A24],
  [1.12459, 653]
]

Что соответствует вашему итеративному подходу и которое не работает с примитивными массивами.

...