有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

集合如何在Java中将唯一值从映射列表映射到新的映射列表?

我有一张地图清单

List<Map<String, Object>> myList = [{value1=3, value2=11},{value1=8, value2=16},{value1=3, value2=11},{value1=10, value2=11} ...]

我想将value2提取到一个新的地图列表中,但其中只有唯一的值:

List<Map<String, Object>> res = [{value2=11},{value2=16} ...]

什么是最好的方法


共 (1) 个答案

  1. # 1 楼答案

    试试这个。首先,我要创建一个条目列表<;值2,任意唯一值>;通过使用两个函数。 首先,使用函数filterFunction

    其次,通过使用函数distinctByValue

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.concurrent.ConcurrentHashMap;
    import java.util.function.Function;
    import java.util.function.Predicate;
    import java.util.stream.Collectors;
    
    public class Demo{
    
    public static void main(String[] args) {
        List<Map<String, Object>> myList = new ArrayList<>();
        Map<String, Object> map1 = new HashMap<>();
        map1.put("value1", 3);
        map1.put("value2", 11);
    
        Map<String, Object> map2 = new HashMap<>();
        map2.put("value1", 8);
        map2.put("value2", 16);
    
        Map<String, Object> map3 = new HashMap<>();
        map3.put("value1", 3);
        map3.put("value2", 11);
    
        Map<String, Object> map4 = new HashMap<>();
        map4.put("value1", 10);
        map4.put("value2", 11);
    
        myList.add(map1);
        myList.add(map2);
        myList.add(map3);
        myList.add(map4);
    
        List<Entry<String, Object>> list = myList.stream().flatMap(map -> map.entrySet().stream())
                .filter(s -> filterFuction(s)).filter(distinctByValue(entry -> entry.getValue()))
                .collect(Collectors.toList());
    
        List<Map<String, Object>> list1 = list.stream().map(t -> {
            Map<String, Object> map = new HashMap<>();
            map.put(t.getKey(), t.getValue());
            return map;
        }).collect(Collectors.toList());
        System.out.println(list1);
    }
    
    public static <T> Predicate<T> distinctByValue(Function<? super T, ?> keyExtractor) {
    
        Map<Object, Boolean> seen = new ConcurrentHashMap<>();
        return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }
    
    public static boolean filterFuction(Entry<String, Object> entry) {
        if (entry.getKey().equals("value2"))
            return true;
        return false;
     }
    
    }