从列表转换<map <k,v>&gt;列表<v>(从地图列表中获取所有唯一值)

时间:2016-08-27 07:26:33

标签: java lambda java-8

我有List<Map<String, Object >>喜欢:

[
   {"code":last_name},
   {"code":last_date}, 
   {"code":task_id}
]

现在我想在List中将其转换为:

 [last_name, last_date, task_id]

我已使用此代码转换此

List<Object> allCodeKeeper = new ArrayList<Object>();
for(Map<String,Object> map : list){
    if(!allCodeKeeper.contains(map.get("code"))){
        allCodeKeeper.add(map.get("code"));
    }
}

输出:

[last_name, last_date, task_id]

但我希望使用Lambda表达式进行转换。

3 个答案:

答案 0 :(得分:3)

试试这个:

List<Object> allCodeKeeper = list.stream().map(o -> o.get("code"))
                .distinct().collect(Collectors.toList());

示例运行

    List<Map<String, Object>> list = new ArrayList<>();
    Map<String,Object> map1 = new HashMap<>();
    map1.put("code", "last_name");
    Map<String,Object> map2 = new HashMap<>();
    map2.put("code", "last_date");
    map2.put("code","last_name");//adding a duplicate on purpose
    Map<String,Object> map3 = new HashMap<>();
    map3.put("code", "task_id");
    list.add(map1);
    list.add(map2);
    list.add(map3);
    List<Object> allCodeKeeper = list.stream().map(o -> o.get("code"))
            .distinct().collect(Collectors.toList());
    System.out.println(allCodeKeeper);

也就是说,您最好使用Set而不是使用List作为结果,因为您想要消除重复值。 :

Set<Object> uniqueCodeKeeper = list.stream().map(o -> o.get("code"))
                .collect(Collectors.toSet());

答案 1 :(得分:1)

如果我做对了,这看起来像是在解决你的问题。

public static void main(String[] args) throws Exception {

/*Prepare Data*/
    List<Map<String , Object>> listOfMaps = new ArrayList<Map<String , Object>>();

    Map<String , Object> mapOfStringToObject1 = new HashMap<String , Object>();

    mapOfStringToObject1.put("code", "last_name");

    Map<String , Object> mapOfStringToObject2 = new HashMap<String , Object>();

    mapOfStringToObject2.put("code", "last_date");

    Map<String , Object> mapOfStringToObject3 = new HashMap<String , Object>();
    mapOfStringToObject3.put("code", "task_id");

    listOfMaps.add(mapOfStringToObject1);
    listOfMaps.add(mapOfStringToObject2);
    listOfMaps.add(mapOfStringToObject3);

/*And the lambda , missed the distinct !*/


    List<Object> allCodeKeeper = listOfMaps.stream().map(mapOfString -> mapOfString.values()).distinct().collect(Collectors.toList());

    allCodeKeeper.forEach(System.out::println);


}

答案 2 :(得分:1)

另外要做的是

Set<Object> output= list.stream()  //  Stream<Map<String, Object>>
    .map(Map::values)              // Stream<List<Object>>
    .flatMap(Collection::stream)   // Stream<Object>
    .collect(Collectors.toSet());  //Set<Object>