我不熟悉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表达式(流,过滤器,收集,地图等)获得不同的结果。
答案 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());