List,Map多层循环嵌套Demo及其理解

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: List,Map多层循环嵌套Demo及其理解

先简答贴下POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example.DemoCrud</groupId>
    <artifactId>democurd</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>democurd</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- mybatis整合Springboot -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>
        <dependency>
            <!--           maven 添加json-->
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
        </dependency>
        <!-- 引入org.json所需依赖 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.70</version>
        </dependency>
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>jquery</artifactId>
            <version>3.3.0</version>
        </dependency>
        <!--bootstrap-webjar-->
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>bootstrap</artifactId>
            <version>4.0.0</version>
        </dependency>
        <!--配置文件注入时使用后会有提示-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.18</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/oracle/oracle-jdbc -->
        <dependency>
            <groupId>com.oracle.ojdbc</groupId>
            <artifactId>ojdbc8</artifactId>
            <version>19.3.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>
        <!-- Druid 数据源依赖,集成了 Spring boot ,方便配置 druid 属性 -->
        <!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.8</version>
        </dependency>
        <!-- Mysql 数据库驱动,spring boot 2.1.3 时,mysql 驱动版本为 8.0.15 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!-- 引入 Spring Data JPA,JPA 组件内部会依赖 JDBC 组件,JDBC 组件内部默认依赖的是 HikariCP 数据源-->
        <!--切换 druid 数据源时,HikariCP 依赖可以移除掉,不移除时也不影响-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <!--引用 log4j2 spring boot 启动器,内部依赖了 slf4j、log4j;排除项目中的 logback-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

公共实体类

@Data
@Builder
public class Student {
    private Integer age;
    private String name;
    private Boolean sex; //true:男  false:女
}

单层循环数据存取List,Map

package com.example.democrud.democurd.Prototype.demo01;
import lombok.Builder;
import lombok.Data;
import org.thymeleaf.expression.Lists;
import java.util.*;
import java.util.stream.Collectors;
public class ListAndMapDemo {
    public static void main(String[] args) {
        List<Student> list = stduentInit();
        //取出年龄大于等于20岁的
         getAge20(list);
        //拼接字符串 马丹1,马丹2,马丹3,马丹4,马丹5
        // getStringName(list);
        //拼接字符串取年龄 10,15,20,25,30
        //  getAge(list);
        //根据年龄分组 10,10,20,20, ....
        //ageLimi(list);
    }
    /**
     * 根据年龄分组 10,10,20,20, ....
     *
     * @param list
     */
    public static void ageLimi(List<Student> list) {
        //根据年龄分组
        Map<String, List<Student>> map = new HashMap<>();
        for (Student student : list) {
            List<Student> students = map.get(student.getAge().toString());
            if (students == null) {
                students = new ArrayList<>();
            }
            students.add(student);
            map.put(student.getAge().toString(), students);
        }
        System.out.println("优化前:" + map);
        Map<Integer, List<Student>> collect = list.stream().collect(Collectors.groupingBy(Student::getAge));
        System.out.println("优化前:" + collect);
    }
    /**
     * 拼接字符串取年龄 10,15,20,25,30
     *
     * @param list
     */
    public static void getAge(List<Student> list) {
        // 无法处理空
        //  String collect = list.stream().map(v -> v.getAge().toString()).collect(Collectors.joining(","));
        //  System.out.println("无法处理空"+collect);
        String collect1 = list.stream().filter(v -> v.getAge() != null).map(Student::getAge).map(String::valueOf).collect(Collectors.joining(","));
        System.out.println("可以处理优化前" + collect1);
        String collect2 = list.stream().filter(v -> !Objects.isNull(v.getAge())).map(Student::getAge).map(String::valueOf).collect(Collectors.joining(","));
        System.out.println("可以处理优化后" + collect2);
    }
    /**
     * 拼接字符串 马丹1,马丹2,马丹3,马丹4,马丹5
     *
     * @param list
     */
    public static void getStringName(List<Student> list) {
        StringBuffer buffer = new StringBuffer();
        for (Student student : list) {
            buffer.append(student.getName());
            buffer.append(",");
        }
        String substring = buffer.toString().substring(0, buffer.toString().length() - 1);
        System.out.println("优化前:" + substring);
        String collect = list.stream().map(v -> v.getName()).collect(Collectors.joining(","));
        System.out.println("优化后:" + collect);
    }
    /**
     * 取出年龄大于等于20岁的
     */
    public static void getAge20(List<Student> list) {
        //实现一
        int ages = 20;
        List<Student> list1 = new ArrayList<Student>();
        for (Student student5 : list) {
            if (student5.getAge() >= ages) {
                list1.add(student5);
            }
        }
        System.out.println("优化前:" + list1);
        //实现二
        list = list.stream().filter(v -> v.getAge() >= 20).collect(Collectors.toList());
        System.out.println("优化后:" + list);
    }
    /**
     * 初始化list对象
     */
    public static List<Student> stduentInit() {
        List<Student> list = new ArrayList<Student>();
        //  Student student = new Student(null, "马丹1", true);
        Student student = new Student(10, "马丹1", true);
        Student student1 = new Student(20, "马丹2", false);
        Student student2 = new Student(10, "马丹3", true);
        Student student3 = new Student(10, "马丹4", false);
        Student student4 = new Student(20, "马丹5", true);
        list.add(student);
        list.add(student1);
        list.add(student2);
        list.add(student3);
        list.add(student4);
        return list;
    }
}

运行效果一一进行展示:

1.取出年龄大于等于20岁的

//取出年龄大于等于20岁的
        getAge20(list);     
List原始数据==>[Student(age=10, name=马丹1, sex=true), Student(age=20, name=马丹2, sex=false), Student(age=10, name=马丹3, sex=true), Student(age=10, name=马丹4, sex=false), Student(age=20, name=马丹5, sex=true)]
优化前:[Student(age=20, name=马丹2, sex=false), Student(age=20, name=马丹5, sex=true)]
优化后:[Student(age=20, name=马丹2, sex=false), Student(age=20, name=马丹5, sex=true)]

2.拼接字符串 马丹1,马丹2…

//拼接字符串 马丹1,马丹2,马丹3,马丹4,马丹5
         getStringName(list);
List原始数据==>[Student(age=10, name=马丹1, sex=true), Student(age=20, name=马丹2, sex=false), Student(age=10, name=马丹3, sex=true), Student(age=10, name=马丹4, sex=false), Student(age=20, name=马丹5, sex=true)]
优化前:马丹1,马丹2,马丹3,马丹4,马丹5
优化后:马丹1,马丹2,马丹3,马丹4,马丹5

3. 拼接字符串取年龄 10,15,20,25,30

//拼接字符串取年龄 10,15,20,25,30
         getAge(list);
List原始数据==>[Student(age=10, name=马丹1, sex=true), Student(age=20, name=马丹2, sex=false), Student(age=10, name=马丹3, sex=true), Student(age=10, name=马丹4, sex=false), Student(age=20, name=马丹5, sex=true)]
可以处理优化前10,20,10,10,20
可以处理优化后10,20,10,10,20

4.0根据年龄分组 10,10,20,20, …

//根据年龄分组 10,10,20,20, ....
        ageLimi(list);
List原始数据==>[Student(age=10, name=马丹1, sex=true), Student(age=20, name=马丹2, sex=false), Student(age=10, name=马丹3, sex=true), Student(age=10, name=马丹4, sex=false), Student(age=20, name=马丹5, sex=true)]
可以处理优化前10,20,10,10,20
可以处理优化后10,20,10,10,20

多层循环嵌套

package com.example.democrud.democurd.Prototype.demo01;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.util.*;
import java.util.stream.Collectors;
public class ListAndMap1Demo {
    public static void main(String[] args) {
      // 循环中获取数据
    //  stduentgetName();
     //处理异常嵌套数据
          stduents();
    }
    public static void stduentgetName() {
        Map<String, List<Student>> map = stduentInit();
        //System.out.println(JSONObject.toJSON(map));
        for (Map.Entry<String, List<Student>> entry : map.entrySet()) {
            String key = entry.getKey();
            List<Student> list = entry.getValue();
            System.out.println("key===>"+key);
            System.out.println("list===>"+list);
            List<String> collect = list.stream().map(Student::getName).collect(Collectors.toList());
            System.out.println("list: 集合数组==》" + collect);
            String collect1 = list.stream().map(Student::getName).collect(Collectors.joining(","));
            System.out.println("string: String数组==》" + collect1);
            System.out.println("--------------------------------------1---------------------------------------------");
            List<Student> collectle = list.stream().filter(v -> v.getAge() >= 20).collect(Collectors.toList());
            System.out.println("collectle==>"+collectle);
            System.out.println("---------------------------------2--------------------------------------------------");
            List<String> strList = new ArrayList<>();
            for (Student stu : list) {
                strList.add(stu.getName());
            }
            System.out.println("strList: " + strList);
        }
    }
    /**
     * 处理深层嵌套异常数据
     */
    public static void stduents() {
        List<Map<String, String>> list = new ArrayList<>();
        String str = "{\"sheets\":[{\"datas\":[{\"cells\":[{\"dataType\":2,\"value\":\"闫文超\"},{\"dataType\":1,\"value\":\"10.0\"}]},{\"cells\":[{\"dataType\":2,\"value\":\"老王\"},{\"dataType\":1,\"value\":\"20.0\"}]}],\"name\":\"Sheet1\",\"titles\":[\"Name\",\"AGE\"]}]}";
        JSONObject js = JSONObject.parseObject(str);
        //System.out.println(js);
        String sheets = js.get("sheets").toString();
        //System.out.println(sheets);
        JSONArray objects = JSONArray.parseArray(sheets);
        //System.out.println(objects);
        for (Object object : objects) {
            JSONObject js111 = JSONObject.parseObject(object.toString());
            //System.out.println(js111);
            String datas = js111.get("datas").toString();
            //System.out.println(datas);
            JSONArray objects1 = JSONArray.parseArray(datas);
            //System.out.println(objects1);
            for (Object o : objects1) {
                JSONObject js1111 = JSONObject.parseObject(o.toString());
                //System.out.println(js1111);
                String cells = js1111.get("cells").toString();
                //System.out.println(cells);
                JSONArray objects2 = JSONArray.parseArray(cells);
                //System.out.println("objects2 : "+ objects2);
                for (Object o1 : objects2) {
                    JSONObject js11111 = JSONObject.parseObject(o1.toString());
                    //System.out.println(js11111);
                    String dataType = js11111.get("dataType").toString();
                    String value = js11111.get("value").toString();
                    Map<String, String> map = new HashMap<>();
                    map.put(dataType, value);
                    list.add(map);
                    //System.out.println("这他妈那个傻逼写的 dataType=" + dataType + "  value="+ value);
                }
            }
        }
        System.out.println(list);
    }
    /**
     * 初始化list对象
     */
    public static Map<String, List<Student>> stduentInit() {
        Map<String, List<Student>> map = new HashMap<>();
        List<Student> list = new ArrayList<>();
        Student student = new Student(10, "马丹1", true);
        Student student1 = new Student(15, "马丹2", false);
        Student student2 = new Student(20, "马丹3", true);
        Student student3 = new Student(25, "马丹4", false);
        Student student4 = new Student(30, "马丹5", true);
        list.add(student);
        list.add(student1);
        list.add(student2);
        list.add(student3);
        list.add(student4);
        map.put("list", list);
        List<Student> list1 = new ArrayList<>();
        Student stu = new Student(10, "马丹1", true);
        Student stu1 = new Student(15, "马丹2", false);
        Student stu2 = new Student(20, "马丹3", true);
        Student stu3 = new Student(25, "马丹4", false);
        Student stu4 = new Student(30, "马丹5", true);
        list1.add(stu);
        list1.add(stu1);
        list1.add(stu2);
        list1.add(stu3);
        list1.add(stu4);
        map.put("list1", list1);
        return map;
    }
}

1.处理异常嵌套数据

//处理异常嵌套数据
          stduents();

此处不理解的可以把sout注释取下;每步都有打印我这边为了更好的展示就先注释了;

[{2=闫文超}, {1=10.0}, {2=老王}, {1=20.0}]

2.循环中获取数据

// 循环中获取数据
        stduentgetName();
key===>list1
list===>[Student(age=10, name=马丹1, sex=true), Student(age=15, name=马丹2, sex=false), Student(age=20, name=马丹3, sex=true), Student(age=25, name=马丹4, sex=false), Student(age=30, name=马丹5, sex=true)]
list: 集合数组==》[马丹1, 马丹2, 马丹3, 马丹4, 马丹5]
string: String数组==》马丹1,马丹2,马丹3,马丹4,马丹5
--------------------------------------1---------------------------------------------
collectle==>[Student(age=20, name=马丹3, sex=true), Student(age=25, name=马丹4, sex=false), Student(age=30, name=马丹5, sex=true)]
---------------------------------2--------------------------------------------------
strList: [马丹1, 马丹2, 马丹3, 马丹4, 马丹5]
key===>list
list===>[Student(age=10, name=马丹1, sex=true), Student(age=15, name=马丹2, sex=false), Student(age=20, name=马丹3, sex=true), Student(age=25, name=马丹4, sex=false), Student(age=30, name=马丹5, sex=true)]
list: 集合数组==》[马丹1, 马丹2, 马丹3, 马丹4, 马丹5]
string: String数组==》马丹1,马丹2,马丹3,马丹4,马丹5
--------------------------------------1---------------------------------------------
collectle==>[Student(age=20, name=马丹3, sex=true), Student(age=25, name=马丹4, sex=false), Student(age=30, name=马丹5, sex=true)]
---------------------------------2--------------------------------------------------
strList: [马丹1, 马丹2, 马丹3, 马丹4, 马丹5]

欧克;演示完成后续有其他部分会补充;此处感谢吊毛同学的交流;


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
存储 安全 Java
java集合框架及其特点(List、Set、Queue、Map)
java集合框架及其特点(List、Set、Queue、Map)
|
4月前
|
数据处理
利用Stream流将取到的对象List<对象>形式数据进行分组统计转变成Map<分组条件,数量统计>形式
利用Stream流将取到的对象List<对象>形式数据进行分组统计转变成Map<分组条件,数量统计>形式
24 0
|
4月前
|
Java 程序员
Java集合框架:List、Set、Map类型及泛型详解
Java集合框架:List、Set、Map类型及泛型详解
|
6天前
|
Java API
List转Map(id为key,list为value)
List转Map(id为key,list为value)
8 0
|
1月前
|
存储 C语言 C++
C++中STL常用容器(vector、deque、list、map、set)一文带你了解
C++中STL常用容器(vector、deque、list、map、set)一文带你了解
如何使用Stream流将List转换为Map
如何使用Stream流将List转换为Map
|
4月前
|
Java 索引
java8流处理器list转map的对比
java8流处理器list转map的对比
33 0
|
4月前
|
存储 Java API
利用Stream流将取到的对象List<对象>形式数据进行分组统计转变成Map<分组条件,数量统计>形式
利用Stream流将取到的对象List<对象>形式数据进行分组统计转变成Map<分组条件,数量统计>形式
27 0
|
4月前
|
Java 测试技术
List<实体类>转map<String,String>及重复处理
List<实体类>转map<String,String>及重复处理
33 0
|
4月前
|
Java
java8 foreach用法list转map、map转list
java8 foreach用法list转map、map转list