1.Map集合

1.1Map集合概述和特点【理解】
        
        interface Map<K,V> K:键的类型;V:值的类型
Map集合的特点
        双列集合,一个键对应一个值
        键不可以重复,值可以重复

1.2Map集合的基本功能【应用】

1.3Map集合的获取功能【应用】

1.4Map集合的遍历(方式1)【应用】

步骤分析
获取所有键的集合。用keySet()方法实现
遍历键的集合,获取到每一个键。用增强for实现
根据键去找值。用get(Object key)方法实现

代码实现

public class MapDemo01 {public static void main(String[] args) {//创建集合对象Map<String, String> map = new HashMap<String, String>();//添加元素map.put("张无忌", "赵敏");map.put("郭靖", "黄蓉");map.put("杨过", "小龙女");        //获取所有键的集合。用keySet()方法实现Set<String> keySet = map.keySet();//遍历键的集合,获取到每一个键。用增强for实现for (String key : keySet) {//根据键去找值。用get(Object key)方法实现String value = map.get(key);System.out.println(key + "," + value);}}
}

1.5Map集合的遍历(方式2)【应用】
步骤分析
        获取所有键值对对象的集合
                Set> entrySet():获取所有键值对对象的集合
        遍历键值对对象的集合,得到每一个键值对对象
                用增强for实现,得到每一个Map.Entry
        根据键值对对象获取键和值
                用getKey()得到键
                用getValue()得到值

public class MapDemo02 {
    public static void main(String[] args) {
        //创建集合对象
        Map<String, String> map = new HashMap<String, String>();

//添加元素
        map.put("张无忌", "赵敏");
        map.put("郭靖", "黄蓉");
        map.put("杨过", "小龙女");

        //获取所有键值对对象的集合
        Set<Map.Entry<String, String>> entrySet = map.entrySet();

        //遍历键值对对象的集合,得到每一个键值对对象
        for (Map.Entry<String, String> me : entrySet) {
            //根据键值对对象获取键和值
            String key = me.getKey();
            String value = me.getValue();
            System.out.println(key + "," + value);
        }
    }
}

2.HashMap集合

2.1HashMap集合概述和特点【理解】

        HashMap底层是哈希表结构的
        依赖hashCode方法和equals方法保证键的唯一
        如果要存储的是自定义对象,需要重写hashCode和equals方法

2.2HashMap集合应用案例【应用】

  • 案例需求

    • 创建一个HashMap集合,键是学生对象(Student),值是居住地 (String)。存储多个元素,并遍历。

    • 要求保证键的唯一性:如果学生对象的成员变量值相同,我们就认为是同一个对象

public static void main(String[] args) {HashMap<Student,String> has = new HashMap<>();Student stu1 = new Student("王三","18");Student stu2 = new Student("kaka","18");Student stu3 = new Student("王五","18");has.put(stu1,"河南");has.put(stu2,"北京");has.put(stu3,"天津");// 第一种方式遍历Set<Student> students = has.keySet();for (Student student : students) {String sv = has.get(student);System.out.println(student+"--------------"+sv);}// 第二种方式遍历Set<Map.Entry<Student, String>> ehas = has.entrySet();for (Map.Entry<Student, String> eha : ehas) {Student key = eha.getKey();String value = eha.getValue();System.out.println(key + "--------------" + value);}// 第三种方式遍历has.forEach((Student key ,String value)->{System.out.println(key+ "----" + value);}

3.TreeMap集合

3.1TreeMap集合概述和特点【理解】

  • TreeMap底层是红黑树结构

  • 依赖自然排序或者比较器排序,对键进行排序

  • 如果存储的是自定义对象,需要实 现C omparable接口或者在创建TreeMap对象时候给出比较器排序规则

3.2TreeMap集合应用案例【应用】

  • 案例需求

    • 创建一个TreeMap集合,键是学生对象(Student),值是籍贯(String),学生属性姓名和年龄,按照年龄进行排序并遍历

    • 要求按照学生的年龄进行排序,如果年龄相同则按照姓名进行排序

  • 代码实现

public class Student implements Comparable<Student>{

@Override
    public int compareTo(Student o) {
        //按照年龄进行排序
        int result = o.getAge() - this.getAge();
        //次要条件,按照姓名排序。
        result = result == 0 ? o.getName().compareTo(this.getName()) : result;
        return result;
    }

4.可变参数

4.1可变参数【应用】

  • 可变参数介绍

    • 可变参数又称参数个数可变,用作方法的形参出现,那么方法参数个数就是可变的了

    • 方法的参数类型已经确定,个数不确定,我们可以使用可变参数

  • 可变参数定义格式

    修饰符 返回值类型 方法名(数据类型… 变量名) {  } 
  • 可变参数的注意事项

    • 这里的变量其实是一个数组

    • 如果一个方法有多个参数,包含可变参数,可变参数要放在最后

可变参数的基本使用

public class test1 {public static void main(String[] args) {int i = getNum(1,2,3,4);System.out.println(i);}private static int getNum(int...arr) {int sum = 0;for (int i = 0; i < arr.length; i++) {sum += arr[i];}return sum;}
}

4.2创建不可变集合【理解】

  • 方法介绍

    • 在List、Set、Map接口中,都存在of方法,可以创建一个不可变的集合

      • 这个集合不能添加,不能删除,不能修改

      • 但是可以结合集合的带参构造,实现集合的批量添加

    • 在Map接口中,还有一个ofEntries方法可以提高代码的阅读性

      • 首先会把键值对封装成一个Entry对象,再把这个Entry对象添加到集合当中

// static <E>  List<E>  of(E…elements)  创建一个具有指定元素的List集合对象
        //static <E>  Set<E>  of(E…elements)    创建一个具有指定元素的Set集合对象
        //static <K , V>   Map<K,V>  of(E…elements) 创建一个具有指定元素的Map集合对象

//集合的批量添加。
        //首先是通过调用List.of方法来创建一个不可变的集合,of方法的形参就是一个可变参数。
        //再创建一个ArrayList集合,并把这个不可变的集合中所有的数据,都添加到ArrayList中。
        ArrayList<String> list3 = new ArrayList<>(List.of("a", "b", "c", "d"));
        System.out.println(list3);
    }

private static void method3() {
        Map<String, String> map = Map.of("zhangsan", "江苏", "lisi", "北京", "wangwu", "天津");
        System.out.println(map);
    }

private static void method4() {
        Map<String, String> map = Map.ofEntries(
                Map.entry("zhangsan", "江苏"),
                Map.entry("lisi", "北京"));
        System.out.println(map);
    }

5.Stream流

5.1体验Stream流【理解】

  • 案例需求

    按照下面的要求完成集合的创建和遍历

    • 创建一个集合,存储多个字符串元素

    • 把集合中所有以"张"开头的元素存储到一个新的集合

    • 把"张"开头的集合中的长度为3的元素存储到一个新的集合

    • 遍历上一步得到的集合

//创建一个集合,存储多个字符串元素
ArrayList<String> list = new ArrayList<String>();list.add("林青霞");
list.add("张曼玉");
list.add("王祖贤");
list.add("柳岩");
list.add("张敏");
list.add("张无忌");
//把集合中所有以"张"开头的元素存储到一个新的集合
ArrayList<String> zhangList = new ArrayList<String>();for(String s : list) {if(s.startsWith("张")) {zhangList.add(s);}
}
System.out.println(zhangList);ArrayList<String> threeList = new ArrayList<String>();for(String s : zhangList) {if(s.length() == 3) {threeList.add(s);}
}
for (String s : threeList) {System.out.println(s);}
// Stream 流
list.stream().filter(s ->s.startsWith("张")).filter(s -> s.length() == 3).forEach(s -> System.out.println(s));

  • Stream流的好处

    • 直接阅读代码的字面意思即可完美展示无关逻辑方式的语义:获取流、过滤姓张、过滤长度为3、逐一打印

    • Stream流把真正的函数式编程风格引入到Java中

    • 代码简洁

5.2Stream流的常见生成方式【应用】

Stream流的思想

  • Stream流的三类方法

    • 获取Stream流

      • 创建一条流水线,并把数据放到流水线上准备进行操作

    • 中间方法

      • 流水线上的操作

      • 一次操作完毕之后,还可以继续进行其他操作

    • 终结方法

      • 一个Stream流只能有一个终结方法

      • 是流水线上的最后一个操作

生成Stream流的方式

  • Collection体系集合

    使用默认方法stream()生成流, default Stream<E> stream()

  • Map体系集合

    把Map转成Set集合,间接的生成流

  • 数组

    通过Arrays中的静态方法stream生成流

  • 同种数据类型的多个数据

    通过Stream接口的静态方法of(T... values)生成流

代码演示

//Collection体系的集合可以使用默认方法stream()生成流
        List<String> list = new ArrayList<String>();
        Stream<String> listStream = list.stream

Set<String> set = new HashSet<String>();
        Stream<String> setStream = set.stream();

//Map体系的集合间接的生成流
        Map<String,Integer> map = new HashMap<String, Integer>();
        Stream<String> keyStream = map.keySet().stream();
        Stream<Integer> valueStream = map.values().stream();
        Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream();

//数组可以通过Arrays中的静态方法stream生成流
        String[] strArray = {"hello","world","java"};
        Stream<String> strArrayStream = Arrays.stream(strArray);
      
          //同种数据类型的多个数据可以通过Stream接口的静态方法of(T... values)生成流
        Stream<String> strArrayStream2 = Stream.of("hello", "world", "java");
        Stream<Integer> intStream = Stream.of(10, 20, 30);
    }

5.3Stream流中间操作方法【应用】

  • 概念

    中间操作的意思是,执行完此方法之后,Stream流依然可以继续执行其他操作

  • 常见方法

    方法名 说明
    Stream<T> filter(Predicate predicate) 用于对流中的数据进行过滤
    Stream<T> limit(long maxSize) 返回此流中的元素组成的流,截取前指定参数个数的数据
    Stream<T> skip(long n) 跳过指定参数个数的数据,返回由该流的剩余元素组成的流
    static <T> Stream<T> concat(Stream a, Stream b) 合并a和b两个流为一个流
    Stream<T> distinct() 返回由该流的不同元素(根据Object.equals(Object) )组成的流

//需求1:取前4个数据组成一个流
        Stream<String> s1 = list.stream().limit(4);

//需求2:跳过2个数据组成一个流
        Stream<String> s2 = list.stream().skip(2);

//需求3:合并需求1和需求2得到的流,并把结果在控制台输出
//        Stream.concat(s1,s2).forEach(System.out::println);

//需求4:合并需求1和需求2得到的流,并把结果在控制台输出,要求字符串元素不能重复
        Stream.concat(s1,s2).distinct().forEach(System.out::println);

5.4Stream流终结操作方法【应用】

  • 概念

    终结操作的意思是,执行完此方法之后,Stream流将不能再执行其他操作

常见方法

方法名 说明
void forEach(Consumer action) 对此流的每个元素执行操作
long count() 返回此流中的元素

//需求2:统计集合中有几个以张开头的元素,并把统计结果在控制台输出
        long count = list.stream().filter(s -> s.startsWith("张")).count();
        System.out.println(count);

ArrayList<Integer> list = new ArrayList<>();
for (int i = 1; i <= 10; i++) {list.add(i);
//        list.stream().filter((Integer number )->{
//            return number % 2 == 0;
//
//        });        list.stream().filter(number -> number % 2 == 0 ).forEach(number -> System.out.println(number));System.out.println("------------------------------------");for (Integer integer : list) {System.out.println(integer);

5.5Stream流的收集操作【应用】

  • 概念

    对数据使用Stream流的方式操作完毕后,可以把流中的数据收集到集合中

  • 常用方法

    方法名 说明
    R collect(Collector collector) 把结果收集到集合中
  • 工具类Collectors提供了具体的收集方式

    方法名 说明
    public static <T> Collector toList() 把元素收集到List集合中
    public static <T> Collector toSet() 把元素收集到Set集合中
    public static Collector toMap(Function keyMapper,Function valueMapper) 把元素收集到Map集合中

//定义一个字符串数组,每一个字符串数据由姓名数据和年龄数据组合而成
//需求5:得到字符串中年龄数据大于28的流
//需求6:把使用Stream流操作完毕的数据收集到Map集合中并遍历,字符串中的姓名作键,年龄作值
public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("林青霞,30");list.add("张曼玉,35");list.add("王祖贤,33");list.add("柳岩,25");Map<String, Integer> collect = list.stream().filter((String s) -> {             String[] split = s.split(",");int age = Integer.parseInt(split[1]);return age > 28;}).collect(Collectors.toMap((String s) -> {return s.split(",")[0];},(String s) -> {return Integer.parseInt(s.split(",")[1]);}));System.out.println(collect);

5.6Stream流综合练习【应用】

  • 案例需求

    现在有两个ArrayList集合,分别存储6名男演员名称和6名女演员名称,要求完成如下的操作

    • 男演员只要名字为3个字的前三人

    • 女演员只要姓林的,并且不要第一个

    • 把过滤后的男演员姓名和女演员姓名合并到一起

    • 把上一步操作后的元素作为构造方法的参数创建演员对象,遍历数据

    演员类Actor已经提供,里面有一个成员变量,一个带参构造方法,以及成员变量对应的get/set方法

public static void main(String[] args) {ArrayList<String> manlist = new ArrayList<>();manlist.add("周润发");manlist.add("成龙");manlist.add("刘德华");manlist.add("吴京");manlist.add("周星驰");manlist.add("李连杰");ArrayList<String>womanlist = new ArrayList<>();womanlist.add("林心如");womanlist.add("张曼玉");womanlist.add("林青霞");womanlist.add("柳岩");womanlist.add("林志玲");womanlist.add("王祖贤");//男演员只要名字为3个字的前三人Stream<String> stram1 = manlist.stream().filter(name -> name.length() == 3).limit(3);//女演员只要姓林的,并且不要第一个Stream<String> stream2 = womanlist.stream().filter(name -> name.startsWith("林")).skip(1);//把上一步操作后的元素作为构造方法的参数创建演员对象,遍历数据 Stream.concat(stram1,stream2).forEach(name -> {Actor actor = new Actor(name);System.out.println(actor);});

Map HasNap 集合Strem流相关推荐

  1. JavaSE-23.2.1【Strem流、Stream流的使用和常见生成方式】

    1 package day14.lesson2;2 3 import java.util.ArrayList;4 5 /*6 2 Strem流7 8 2.1 体验Stream流9 10 案例需求 11 ...

  2. java 读取集合到流中_Java 10:将流收集到不可修改的集合中

    java 读取集合到流中 Java 10引入了几种新方法来促进不可修改集合的创建. List.copyOf , Set.copyOf和Map.copyOf方法从现有实例创建新的集合实例. 例如: Li ...

  3. 第八章_集合(3)_Map集合Stream流

    目录 一.Map 1.Map集合的基本使用 2.Map集合的常用方法 3.Map集合遍历 二.HashMap 三.TreeMap 四.可变参数 五.Stream流 1.Stream流概念 2.获取St ...

  4. 不可变集合 Stream流 异常

    目录 创建不可变集合 如何创建不可变集合? Stream流 Stream流的概述 Stream流的获取 Stream流的常用API Stream流的综合应用 收集Stream流 异常处理 异常概述.体 ...

  5. 21.5 Strem流

    生成Stream流的方式  Collection体系集合  使用默认方法stream()生成流, default Stream stream() Map体系集合  把Map转成Set集合,间接的生成流 ...

  6. 可变参数和Strem流

    可变参数 可变参数用在方法的形式参数的位置,它可以看做是一个数组,可以接收多个实际参数. public static void main(String[] args){int sum1=getSum( ...

  7. 使用entrySet遍历Map类集合KV,而不是keySet方式进行遍历

    使用entrySet遍历Map类集合KV,而不是keySet方式进行遍历

  8. 使用 entrySet 遍历 Map 类集合 KV ,而不是 keySet 方式进行遍历的好处

    使用 entrySet 遍历 Map 类集合 KV ,而不是 keySet 方式进行遍历. 说明: keySet 其实是遍历了 2 次,一次是转为 Iterator 对象,另一次是从 hashMap ...

  9. js中数据结构数组Array、映射Map、集合Set、对象、JSON

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js中数据结构 js中原生自带的数据结构比较简单,主要有数组Array.映射Map.集合Set.我们可以根据这三个基本数据结构实 ...

最新文章

  1. 企业根CA方法客户机证书的解决方案,ISA2006系列之三十
  2. Google收购安全分析软件厂商Zynamics
  3. linux 下 C 编程和make的方法 (十、C版的try catch 捕捉段错误和异常处理)
  4. RSS - 简单方便的follow资讯
  5. 【PHP】循环 调用第三方API (curl ),性能优化
  6. 三十一、Scrapy爬取百度图片
  7. 密码学专题 OpenSSL中SSL相关指令
  8. 树的遍历和图的遍历的异同
  9. Excel和PPT已经落后了,可视化大屏强在哪?一次看过瘾
  10. 打造数据中心的软实力
  11. mysql的内连接与外连接
  12. 腾讯广告算法大赛 | 复赛第一周周冠军心得分享
  13. c# txt代码转换成HTML格式
  14. UPX3.03+UpolyX.5 Shell v1.0 汉化绿色版
  15. plc编程及应用_西门子PLC编程与工程应用
  16. Javascript笔记大全03
  17. Mybatis映射详解
  18. python-自动化运维、办公、爬虫和娱乐
  19. 鲜为人知的myeclipse配置
  20. EduCoder-Web程序设计基础-html5—移动端电商页面制作-(第1关:移动端电商页面制作)

热门文章

  1. 使用orange进行分类预测
  2. 苹果7手机没信号无服务器,它坑了多少果粉?iPhone7手机无服务还有感叹号,基带通病问题!...
  3. 【引言】浙大机器学习课程记录
  4. python数独伪代码回溯法_数独 #回溯算法 #CTF
  5. 6 OF 100DAYS
  6. Abp小知识-如何全局设置DontWrapResult属性
  7. python中文件最重要的功能陶瓷材料_材料按照功能不同分为
  8. 多模块项目依赖注入失败Field xxRepository in xxImpl required a bean of type xxRepository that could not be found
  9. TDK| 电源——反激变压器设计过程
  10. STM32按键的检测IO口上拉下拉电阻