精华内容
下载资源
问答
  • java stream list转map

    千次阅读 2020-07-29 10:26:37
    StreamList转换为Map,使用Collectors.toMap方法进行转换 背景:User类,类中分别有id,name,age三个属性。List集合,userList,存储User对象 1、指定key-value,value是对象中的某个属性值。 Map<Integer,...

    java 8 使用stream流来对集合进行处理:

    Stream将List转换为Map,使用Collectors.toMap方法进行转换

    背景:User类,类中分别有id,name,age三个属性。List集合,userList,存储User对象

    1、指定key-value,value是对象中的某个属性值

     Map<Integer,String> userMap1 = userList.stream().collect(Collectors.toMap(User::getId,User::getName));

    2、指定key-value,value是对象本身,User->User 是一个返回本身的lambda表达式

    Map<Integer,User> userMap2 = userList.stream().collect(Collectors.toMap(User::getId,User->User));

    3、指定key-value,value是对象本身,Function.identity()是简洁写法,也是返回对象本身

     Map<Integer,User> userMap3 = userList.stream().collect(Collectors.toMap(User::getId, Function.identity()));

    4、指定key-value,value是对象本身,Function.identity()是简洁写法,也是返回对象本身,key 冲突的解决办法,这里选择第二个key覆盖第一个key

     Map<Integer,User> userMap4 = userList.stream().collect(Collectors.toMap(User::getId, Function.identity(),(key1,key2)->key2));

    注意:用Collectors的toMap方法转换List,一般会遇到两个问题。一个是转换map,key重复问题;另一个是空指针异常,即转为map的value是null。
    问题解决!!!
    一、第一种问题报的错误如下:Duplicate key
    在这里插入图片描述

    使用(key1,key2)->key2表达式可以解决此类问题,如果出现重复的key就使用key2覆盖前面的key1,也可以定义成(key1,key2)->key1,保留key1,根据自己的业务场景来调整。

     

     

     

    当使用二个list集合,根据某个值来给你list赋值时,我们之前都是采用双层for循环来实现,现在我们可以使用stream()+lamda表达式来提升效率

    实例如下:

    首先创建两个对象男生和女生:

    // 男生 get set和toString这里省略
    public class SchoolBoy {
        private String girlId;
        
        private String id;
        
        private String name;
     
        private String grilName;
    }
    // 女生 get set和toString这里省略
    public class Girl {
        private String id;
     
        private String name;
    }
    根据男生对象中的girlId去匹配女生对象并把男生对象的grilName字段赋值

    下面展示一个demo

    public static void main(String[] args) {
        List<SchoolBoy> schoolBoys = new ArrayList<>(3);
        SchoolBoy boy1 = new SchoolBoy();
        boy1.setGirlId("1");
        boy1.setId("10");
        boy1.setName("小明");
     
        SchoolBoy boy2 = new SchoolBoy();
        boy2.setGirlId("2");
        boy2.setId("11");
        boy2.setName("小豪");
     
        SchoolBoy boy3 = new SchoolBoy();
        boy3.setGirlId("3");
        boy3.setId("12");
        boy3.setName("小白");
        schoolBoys.add(boy1);
        schoolBoys.add(boy2);
        schoolBoys.add(boy3);
     
        List<Girl> girls = new ArrayList<>(3);
        Girl girl1 = new Girl();
        girl1.setId("1");
        girl1.setName("小英");
     
        Girl girl2 = new Girl();
        girl2.setId("2");
        girl2.setName("小美");
     
        Girl girl3 = new Girl();
        girl3.setId("3");
        girl3.setName("小花");
        girls.add(girl1);
        girls.add(girl2);
        girls.add(girl3);
        
        List<SchoolBoy> list = schoolBoys.stream()
            .map(schoolBoy -> girls.stream()
                    .filter(girl -> schoolBoy.getGirlId().equals(girl.getId()))
                    .findFirst()
                    .map(girl -> {
                        schoolBoy.setGrilName(girl.getName());
                        return schoolBoy;
                    }).
    orElse(null))
            .collect(Collectors.toList());
        System.out.println(list.toString());
    }

    最后执行的结果:

    [SchoolBoy [girlId=1, id=10, name=小明, grilName=小英],

    SchoolBoy [girlId=2, id=11, name=小豪, grilName=小美],

    SchoolBoy [girlId=3, id=12, name=小白, grilName=小花]]

    这个表达式有一个orElse(null)这里要注意一下:通过修改id来出现id没有匹配的话,就返回null,

    [SchoolBoy [girlId=1, id=10, name=小明, grilName=小英],

    SchoolBoy [girlId=2, id=11, name=小豪, grilName=小美],

    null]

    少行数据,这样显然不是我们想要的,这里我们做了改成

    我们使用orElse(schoolBoy),这样只是不在schoolBoy中设置name值而已。但不至于少一行数据

    [SchoolBoy [girlId=1, id=10, name=小明, grilName=小英],

    SchoolBoy [girlId=2, id=11, name=小豪, grilName=小美],

    SchoolBoy [girlId=3, id=12, name=小白, grilName=null]]

    展开全文
  • Java stream List Map<Object, List> JAVA中的Stream操作一定程度上方便了数据的转换,List转Map的场景下,针对downStream的操作一般较少遇到,遇到的时候一时间也不容易想到处理方式,这里记录一下。 ...

    Java stream List 转 Map<Object, List>


    JAVA中的Stream操作一定程度上方便了数据的转换,ListMap的场景下,针对downStream的操作一般较少遇到,遇到的时候一时间也不容易想到处理方式,这里记录一下。

    示例代码:

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    import java.util.stream.Collectors;
    
    public class StringTest {
    
        public static void main(String[] args) {
            Student student1 = new Student(16, "Alice");
            Student student2 = new Student(16, "Bob");
            Student student3 = new Student(17, "Cherry");
            Student student4 = new Student(17, "Delivery");
            List<Student> studentList = new ArrayList<>();
            studentList.add(student1);
            studentList.add(student2);
            studentList.add(student3);
            studentList.add(student4);
            // List to Map<Object, List>
            // 1. 首先使用`Collectors.groupingBy()根据某个字段进行分组`
            // 2. 分组的同时使用`Collectors.mapping()`将分组后的数据组织起来
            Map<Integer, List<String>> map = studentList.stream()
                    .collect(
                            Collectors.groupingBy(Student::getAge,
                            Collectors.mapping(Student::getName, Collectors.toList())));
            System.out.println(map);
    
            // 这里将分组后的数据组织成一个Map
            Map<Integer, Map<String, Student>> map2 = studentList.stream()
                    .collect(
                            Collectors.groupingBy(Student::getAge,
                                    Collectors.toMap(Student::getName, student -> student)));
            System.out.println(map2);
        }
    }
    
    class Student {
    
        private String name;
    
        private Integer age;
    
        Student(Integer age, String name) {
            this.age = age;
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    

    输出:

    # map1
    {
    	16 = [Alice, Bob], 17 = [Cherry, Delivery]
    }
    
    # map2
    {
    	16 = {
    		Bob = Student {
    			name = 'Bob', age = 16
    		},
    		Alice = Student {
    			name = 'Alice', age = 16
    		}
    	}, 17 = {
    		Cherry = Student {
    			name = 'Cherry', age = 17
    		},
    		Delivery = Student {
    			name = 'Delivery', age = 17
    		}
    	}
    }
    
    
    我的个人博客有空来坐坐

    https://www.wangyanan.online

    展开全文
  • collect = parkingImgs.stream().collect(Collectors.toMap(ParkingImg::getPARKING_ID, e -> new ArrayList<>(Arrays.asList(e)), (List<ParkingImg> oldList, List<Parkin...
      Map<String, List<ParkingImg>> collect = parkingImgs.stream().collect(Collectors.toMap(ParkingImg::getPARKING_ID,
                    e -> new ArrayList<>(Arrays.asList(e)),
                    (List<ParkingImg> oldList, List<ParkingImg> newList) -> {
                        oldList.addAll(newList);
                        return oldList;
                    }));

    或者

    Map<String, List<ParkingImg>> collect = parkingImgs.stream().collect(Collectors.groupingBy(ParkingImg::getPARKING_ID));		

     

    展开全文
  • Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以...
  • JAVA8 Stream List转Map 合并 key

    千次阅读 2019-07-10 19:15:23
    stream转map后如何控制合并, 查看Collector.toMap()后发现里面有一个mergeFunction, 然后我就做了如下的操作,记录一下 List<AdvanceStockOutDistributionDetailVO> list = Optional.ofNullable(r...

    今天项目中有个查询库存操作,调用同事接口返回的结果转成map后键有重复,然后就研究了一下
    stream转map后如何控制合并, 查看Collectors.toMap()后发现里面有一个mergeFunction,
    在这里插入图片描述
    然后我就做了如下的操作,记录一下

    List<AdvanceStockOutDistributionDetailVO> list = Optional.ofNullable(result.getModels()).orElse(new ArrayList<>());
    list.stream().collect(Collectors.toMap(AdvanceStockOutDistributionDetailVO::getProductId, AdvanceStockOutDistributionDetailVO::getDeliveryStockQuantity, (deliveryStockQuantity, oldDeliveryStockQuantity) -> {
         oldDeliveryStockQuantity = deliveryStockQuantity.add(oldDeliveryStockQuantity);
         return oldDeliveryStockQuantity;
    }));
    

    最后需要返回第二个参数,大功告成!

    展开全文
  • java8 stream list转map 以及 list去重

    千次阅读 2019-10-11 14:43:52
    dataList 为user的list集合形式,转map: Map<Long, User> dataMap = dataList.stream().collect(Collectors.toMap(User::getDeviceId, user-> user)); 或者 Map<Long, User> dataMap = dataList...
  • 主要介绍了详解Java8新特性Streamlist转map及问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • Java8新特性Streamlist转map及问题解决

    万次阅读 多人点赞 2018-10-11 14:57:44
    List集合转Map,用到的是Stream中Collectors的toMap方法:Collectors.toMap 具体用法实例如下: //声明一个List集合 List&amp;lt;Person&amp;gt; list = new ArrayList(); list.add(new Person(&...
  • JAVA-Stream-List转换Map

    千次阅读 2018-08-04 14:57:10
    使用Java8的Stream Api,将List转换成Map非常方便。 /** * @author wzx * @time 2018/8/4 */ public class ListToMapTest { public static void main(String[] args) { List&lt;Person&gt; persons...
  • 场景是List中存储一些对象集合,需求是按照对象中的某一个属性进行分组转换为Map结构 常规做法: 骚气做法:
  • Stream List to Map Stream提供了List转换为Map提供了非常易用的方法: Collectors.java: public static <T, K, U> Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> ...
  • 第一种: 取list中某2个字段作为Map的K,V 第二种:将id和实体Bean做为K,V 第三种: key存在重复记录时处理 第四种: 使用某个具体的Map类来保存,如保存时使用... return accounts.stream().collect(Collectors.toMap
  • UserDto中UserId字段作为key,每个UserDto作为Value List<UserDto> dtoList= BeanHelper.... map = UserDto.stream().filter(dto -> StringUtil.isNotBlank(dto.getUserId())).collect(Collectors
  • 在使用StreamList转化为Map的时候,抛出了java.lang.IllegalStateException: Duplicate key异常,原因在于生成Map的key出现冲突。 查看如下代码: 当我们根据猫的名字创建名称Map的时候,发现有2个相同的cat2,...
  • StreamList转Map的坑

    千次阅读 2020-08-02 16:27:06
    常规 list map 的方法: Map<String, String> map = new HashMap<>(); for (User user : list) { map.put(user.getName(), user.getAddress()); } 这种方式没什么问题,就是代码不够简洁美观,...
  • Map<String,List<Entity>> Map<String, List<Entity>> dataMap = dataList.stream().collect( Collectors.toMap(x -> String.format("%s:%s", x.getId(), x.getName()), obj -&...
  • java stream List转Map,Object>时,拼接key

    千次阅读 2020-08-27 17:40:18
    = null && testList.size() >= 1){ map = testList.stream().collect(Collectors.toMap(k -> String.format("%s|%s",k.getAg1(),k.getAg2()), k -> k)); } System.out.println(map); Map map2 = new HashMap(); if...
  • StreamList转换为Map,使用Collectors.toMap方法进行转换 背景:User类,类中分别有id,name,age三个属性。List集合,userList,存储User对象 1、指定key-value,value是对象中的某个属性值。 Map<Integer,...
  • name='苹果1', money=3.25, num=10}, Apple{id=1, name='苹果2', money=1.35, num=20}], 2=[Apple{id=2, name='香蕉', money=2.89, num=30}], 3=[Apple{id=3, name='荔枝', money=9.99, num=40}]} 2、List转Map id...
  • import java.util.List; import java.util.Map; public class Test { public static void main(String[] args) { List<Map<String, String>> list = new ArrayList<>(); .
  • public Map<Long, Account> getIdAccountMap(List<Account> accounts) { return accounts.stream().collect(Collectors.toMap(Account::getId, account -> account)); }
  • 在项目中需要将list转map形式,采用java8的stream流 mileageList.stream().collect(Collectors.toMap(MileageMonitorDto::getId,MileageMonitorDto::getValue,(k1,k2)->k1)); 测试中无问题,发布线上,发现...
  • StreamList转为Map汇总

    千次阅读 2020-09-25 09:49:05
    StreamList转换为Map,使用Collectors.toMap方法进行转换。 背景:User类,类中分别有id,name,age三个属性。List集合,userList,存储User对象 1、指定key-value,value是对象中的某个属性值。 Map<...
  • java8中利用stream api将list转map

    千次阅读 2017-03-14 16:45:06
    Region{ string: code; string: label; string: parentCode; //set/get } List&lt;Region&...//Map&lt;regionCode, Region&gt;Map&lt;String, Region&gt; map = cit...
  • package com.pigg.study.tree.common.stream; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;...import java.util.stream.Collectors; import java....
  • 常用方式 ...accounts.stream().collect(Collectors.toMap(Account::getId, Account::getUsername)); } 收集成实体本身map 代码如下: public Map<Long, Account> getIdAccountMap(List<Acc
  • list--转map 方式一 Map<String, OrganizationVO> groupMap = new HashMap<>();//有权限的采购组织 if(CollectionUtils.isNotEmpty(groupList)){ groupMap = groupList.stream().collect(Ma...
  • stream转map,重复key的处理

    千次阅读 2020-12-28 13:58:19
    stream转map,重复key处理

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 111,377
精华内容 44,550
关键字:

streamlist转map