Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过使用Lambda函数在地图列表和对象列表之间匹配字段来创建列表?_Java_Performance_Lambda_Java 8_Refactoring - Fatal编程技术网

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

Java 通过使用Lambda函数在地图列表和对象列表之间匹配字段来创建列表?,java,performance,lambda,java-8,refactoring,Java,Performance,Lambda,Java 8,Refactoring,我是Java lambda表达式的新手,一直在努力解决以下问题: 我有一个标签对象列表,其fieldsid是我想从其他地图列表中提取的唯一键 [ { "objectid": 10, "eventsourceid": 6, "fieldid": "ACQUIRE" }, { "objectid": 13, "eventsourceid": 6, "fieldid": "HASSV

我是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 dataMapList=this.getTableMap();
List columnsLabel=this.getCatalogtypelabel(objectid);
列表体=新的ArrayList();
用于(映射:dataMapList){
String[]行=新字符串[columnsLabel.size()];
int指数=0;
用于(目录标签:columnsLabel){
if(map.containsKey(label.getFieldid())){
行[index++]=map.get(label.getFieldid()).toString();
}
}
正文.添加(行);
}

我想知道使用Lambda表达式(流、过滤器、收集、映射等)是否可能得到不同的结果。

使用
流的可能方法可能是

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());

这与您的迭代方法相匹配,并且避免使用基元数组。

这是使用流的等效方法:

List<String[]> body = dataMapList.stream()
        .map(d -> columnsLabel.stream()
                .map(CatalogLabel::getFieldid)
                .map(d::get)
                .map(Object::toString)
                .toArray(String[]::new))
        .collect(Collectors.toList());
List body=dataMapList.stream()
.map(d->columnsLabel.stream()
.map(CatalogLabel::getFieldid)
.map(d::get)
.map(对象::toString)
.toArray(字符串[]::新建))
.collect(Collectors.toList());
[
  [1.42541559, 67A4], 
  [2.1327, 1A24],
  [1.12459, 653]
]
List<String[]> body = dataMapList.stream()
        .map(d -> columnsLabel.stream()
                .map(CatalogLabel::getFieldid)
                .map(d::get)
                .map(Object::toString)
                .toArray(String[]::new))
        .collect(Collectors.toList());