通过使用Lambda函数匹配地图列表和对象列表之间的字段来创建列表组合?

时间:2019-03-25 16:55:42

标签: java performance lambda java-8 refactoring

我不熟悉Java lambda表达式,一直在努力解决以下问题:

我有一个标签对象列表,它们的fieldsid是我想从其他“地图列表”中提取的唯一键。

[
    {
        "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);
    }

我想知道是否有可能使用Lambda表达式(流,过滤器,收集,地图等)获得不同的结果。

2 个答案:

答案 0 :(得分:0)

使用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]
]

哪种方法与您的迭代方法匹配,并且避免使用原始数组。

答案 1 :(得分:0)

这与使用流等效:

List<String[]> body = dataMapList.stream()
        .map(d -> columnsLabel.stream()
                .map(CatalogLabel::getFieldid)
                .map(d::get)
                .map(Object::toString)
                .toArray(String[]::new))
        .collect(Collectors.toList());