List转Map(id为key,list为value)

简介: List转Map(id为key,list为value)

map的查询时间复杂度为1,为了提高效率经常会将list转为map进行查询

list转map

第一种:id为key,实体为value
 Map<String, SalesProductinfo> stringListMap = selectiveFather.stream().collect(Collectors.toMap(SalesProductinfo::getId, account -> account));

多字段为key,实体为value

Map<String, HumanManpowerPipelineExcel> humanManpowerPipelineExcelMap =
                humanManpowerPipelineExcelList.stream().collect
                        (Collectors.toMap(account-> convertDate(account.getEvaluationDate())+","+account.getDepartmentId(), account -> account));

第二种:id为key,name为value
Map<String, String> stringListMap = globalconstList.stream().collect(Collectors.toMap(Globalconst::getInteriOrid, Globalconst::getConstDisplayName));
第三种:id为key,list为value
globalConstList.stream()
                .collect(Collectors.toMap(globalConst -> globalConst.getGlobalConst().toUpperCase(),
                    globalConst -> Lists.newArrayList(globalConst),
                    (List<Globalconst> newValueList, List<Globalconst> oldValueList) -> {
                        oldValueList.addAll(newValueList);
                        return oldValueList;
                    }));


第四种:多字段为key,list为value
 Map<String,List<ResourcesModuleRank>> map = resourcesModuleRanks.stream().collect(Collectors.toMap(
                p->{return p.getModule() + p.getTechLevel();},
                p->{
                    List<ResourcesModuleRank> peo = new ArrayList<>();
                    peo.add(p);
                    return peo;
                }));
第五种:list转单字段list
 List<String> userIds = selective1.stream().map(ResourcesWorkloadCalculate::getModuleId).collect(Collectors.toList());
第六种:单字段为key,list为value
Map<String, List<ResourcesUserFactor> > stringsListMap = userFactorList .stream().collect(Collectors.groupingBy(ResourcesUserFactor::getUserAccount));

list转map分组

第一种:按照单字段分组
   Map<String, List<ResourcesWorkloadCalculate>> groupByMap = selective.stream().collect(Collectors.groupingBy(ResourcesWorkloadCalculate::getModuleId,ResourcesWorkloadCalculate::getWorkType));

第二种:按照多字段分组
        Map<String, List<ResourcesWorkloadCalculate>> groupByMap =selective.stream().collect(Collectors.groupingBy(o->convertDate(o.getEffectiveDate())+","+o.getWorkType()+","+o.getModuleId()));

第三种: 按照单字段分组,统计个数
 Map<String, Long> map = selective.stream().collect(Collectors.groupingBy(ResourcesModuleRank::getModule, Collectors.counting()));

list转map特殊操作

不同实体的list之间转化,相同属性的赋值

    List<ResourcesInfoCapacityExcel> resourceInfoExcels = resourcesInfoCapacities.stream().map(
                todo -> new ResourcesInfoCapacityExcel(todo.getModelName(), todo.getExistingCapacity(), todo.getForecastWorkload(), todo.getDifferenceWorkload(), todo.getMonth()
                )).collect(Collectors.toList());

循环map

 for(String key:map.keySet()){//keySet获取map集合key的集合  然后在遍历key即可
                String value = map.get(key).toString();//
                System.out.println("key:"+key+" vlaue:"+value);
            }

非stram

相同key将值相加,不同key put进map

  Map<String, Double> foreWorkLoad = new HashMap<>();
foreWorkLoad.merge(key, resourcesWorkloadCalculate1.getWorkLoad(), (a, b) -> a + b);

list转map,相同key的list相加

 Map<String, List<ResourcesInfo>> resourcesInfosListMap =new HashMap<>();
        for (ResourcesInfo resourcesInfo:
        resourcesInfos) {
            String key=resourcesInfo.getModel() + "," + workDateMap.get(resourcesInfo.getMonth());

            List<ResourcesInfo>  moduleRanks = resourcesInfos.stream()
                    .filter(e -> resourcesInfo.getModel() == null || resourcesInfo.getModel().equals(e.getModel())
                    ).filter(e -> resourcesInfo.getMonth() == null || resourcesInfo.getMonth().equals(e.getMonth())
            ).collect(Collectors.toList());
            if (resourcesInfosListMap.get(key)==null){
                resourcesInfosListMap.put(key,moduleRanks);
            }else {
                moduleRanks.addAll(resourcesInfosListMap.get(key));
                resourcesInfosListMap.put(key,moduleRanks);
            }
        }

map转list

将Map转换为List的过程通常涉及将Map中的元素(键值对)转换为List的元素。具体如何转换取决

于你希望List中包含什么:是仅包含键(keys)、仅包含值(values),还是包含键值对本身。以下是几种常见的转换方式:

将Map的键转换为List:

java

Map<String, Integer> map = new HashMap<>();  
map.put("one", 1);  
map.put("two", 2);  
map.put("three", 3);  
List<String> keys = new ArrayList<>(map.keySet());  
System.out.println(keys); // 输出:[one, two, three]

将Map的值转换为List:

List<Integer> values = new ArrayList<>(map.values());  

System.out.println(values); // 输出:[1, 2, 3]

将Map的键值对转换为List中的Entry对象:

List<Map.Entry<String, Integer>> entries = new ArrayList<>(map.entrySet());  
System.out.println(entries); // 输出:[one=1, two=2, three=3] (这是Entry对象的toString表示)

如果你想要一个更简单的List,其中只包含值,并且每个键值对只被转换为一个元素(而不是Entry对象),你可以使用Java 8的Stream API来实现:

List<Integer> simpleList = map.values().stream().collect(Collectors.toList());  
System.out.println(simpleList); // 输出:[1, 2, 3]

或者,如果你想要一个包含键和值的简单List(每个键值对转换为两个元素),你可以这样做:


List<Object> flatList = new ArrayList<>();  
flatList.addAll(map.keySet());  
flatList.addAll(map.values());  
System.out.println(flatList); // 输出:[one, two, three, 1, 2, 3]

请注意,这种将键和值分开添加到List中的方法会丢失键值对之间的关联。如果键值对的关联很重要,那么最好使用包含Entry对象的List。

选择哪种转换方式取决于你的具体需求和你想要如何处理Map中的数据。

汇总

Map<String, String> map = new HashMap<>();

List<String> map= new ArrayList(map.keySet());

List<String> result2 = new ArrayList(map.values());

List<String> result3 = map.keySet().stream()
  .collect(Collectors.toList());

List<String> result4 = map.values().stream()
  .collect(Collectors.toList());

List<String> result5 = map.values().stream()
  .filter(x -> !"apple".equalsIgnoreCase(x))
  .collect(Collectors.toList());


目录
相关文章
|
4月前
|
Dart
Dart之集合详解(List、Set、Map)
Dart之集合详解(List、Set、Map)
|
27天前
|
算法
你对Collection中Set、List、Map理解?
你对Collection中Set、List、Map理解?
31 5
|
2月前
|
存储 安全 Java
java集合框架复习----(4)Map、List、set
这篇文章是Java集合框架的复习总结,重点介绍了Map集合的特点和HashMap的使用,以及Collections工具类的使用示例,同时回顾了List、Set和Map集合的概念和特点,以及Collection工具类的作用。
java集合框架复习----(4)Map、List、set
|
2月前
|
存储 Java 索引
|
4月前
|
存储 Java API
探讨Java中交换Map的Key和Value值的技术
探讨Java中交换Map的Key和Value值的技术
36 2
|
4月前
|
存储 安全 Java
Java集合详解:Set, Map, Vector, List的对比与联系
Java集合框架核心包括List、Set、Map和Vector。List允许重复元素,如ArrayList(适合读取)和LinkedList(适合插入删除)。Set不允许重复,有HashSet(无序)和TreeSet(排序)。Map存储键值对,HashMap(无序)和TreeMap(排序)。Vector是线程安全的ArrayList替代品,但在多线程环境下使用。选择集合类型应根据应用场景,如有序、无序、键值对需求及线程安全考虑。
|
4月前
|
存储 缓存 Java
Java交换map的key和value值
在Java中,直接交换`Map`的key和value是不允许的,因为key是唯一的且不可变。不过,可以通过创建新`Map`实现交换:将原`Map`的value作为新key,key作为新value。注意,如果原`Map`有重复value或null,需额外处理。以下是一个代码示例,展示了如何在value唯一且非null的情况下交换`Map`的key和value。对于重复value或null值的情况,可以使用`List`存储多个key或忽略null值。在实际应用中,`Map`常用于缓存、配置管理、数据库结果映射等多种场景。
59 1
|
4月前
|
存储 安全 Java
Java 集合(List、Set、Map 等)相关问答归纳再整理
HashMap 中使用键对象来计算 hashcode 值 HashSet 使用成员对象来计算 hashcode 值,对于两个对象来说hashcode 可能相同,所以 equals() 方法用来判断对象的相等性,如果两个对象不同的话,那么返回 false。 HashMap 比较快,因为是使用唯一的键来获取对象,HashSet 较 HashMap 来说比较慢。 4.1.3 HashMap 与 TreeMap
26 2
|
4月前
|
存储 安全 程序员
老程序员分享:List、Map、Set之间的联系与区别:
老程序员分享:List、Map、Set之间的联系与区别:
|
4月前
|
安全 Java
java线程之List集合并发安全问题及解决方案
java线程之List集合并发安全问题及解决方案
780 1