Day07 Stream流递归Map集合Collections可变参数

news2025/1/11 19:39:08

Stream

        也叫Stream流,是Jdk8开始新增的一套API (java.util.stream.*),可以用于操作集合或者数组的数据。

       Stream流大量的结合了Lambda的语法风格来编程,提供了一种更加强大,更加简单的方式操作

public class Demo1 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("张无忌");
        list.add("周芷若");
        list.add("赵敏");
        list.add("张强");
        list.add("张三丰");

        //需求:把集合中所有以"张"开头,且是3个字的元素存储到一个新的集合。
        
        //实现2: 使用Stream流方式实现

         List<String> list1 = list.stream().filter(name -> name.startsWith("张") ).
                   filter(name -> name.length() == 3).collect(Collectors.toList());
        System.out.println(list1);
    }
}

Stream流的使用步骤 

1.                                       2.                                              3.

                  

如何获取Stream流 

如何获取Stream流:
    Collection集合:
        单列集合都支持一个stream()方法,它可以直接获取集合的Stream流
    数组:
        Arrays.stream(数组)
    零散数据:
        Stream.of(T... values)
    Map
        双列集合并没有提供直接获取Stream流的方法,他需要间接获取
public class Demo2 {
    public static void main(String[] args) {
        //"玄奘", "悟空", "悟能", "悟净"

        List<String> list = List.of("玄奘", "悟空", "悟能", "悟净");
        //Collection集合: 单列集合都支持一个stream()方法,它可以直接获取集合的Stream流

        list.stream().forEach(System.out::println);

        //数组:Arrays.stream(数组)
        System.out.println("-------------------------------------");
        String[] arr = {"玄奘", "悟空", "悟能", "悟净"};

        Arrays.stream(arr).forEach(System.out::println);
        //零散数据:Stream.of(T... values)

        System.out.println("-------------------------------------");
        Stream.of("玄奘", "悟空", "悟能", "悟净").forEach(System.out::println);
        //Map:双列集合并没有提供直接获取Stream流的方法,他需要间接获取

        System.out.println("-------------------------------------");
        Map<String,String> map = new HashMap<>();
        map.put("001","玄奘");
        map.put("002","悟空");
        map.put("003","悟能");
        map.put("004","悟净");


        //返回一个Set集合
        map.keySet().stream().forEach(System.out::println);
        map.values().stream().forEach(System.out::println);
        System.out.println("-------------------------------------");
        //这是一个整体EntrySetkeyvalue -> e
        map.entrySet().stream().forEach(e -> System.out.println(e.getValue() + e.getKey()));

    }
}

Stream流常见中间方法 

 

public class Demo3 {
    public static void main(String[] args) {
        List<Integer> list = List.of(61, 57, 66, 77, 88, 44, 100, 89, 97, 47, 70);
        //需求1: 找出所有及格的分数,并打印
        System.out.println("=================");

        list.stream()
                .filter(e -> e > 60)
                        .forEach(System.out::println);
        //需求2: 找出所有及格的分数, 正序排列, 打印输出
        System.out.println("=================");

        list.stream()
                .filter(e -> e > 60)
                .sorted((o1, o2) -> o1 - o2)
                .forEach(System.out::println);
        //需求3: 找出所有及格的分数, 倒序排列, 打印输出
        System.out.println("=================");
        list.stream()
                .filter(e -> e > 60)
                        .sorted((o1, o2) -> o2 - o1)
                                .forEach(System.out::println);
        //需求4: 找出所有及格的分数, 倒序排列, 取前3名, 打印输出
        System.out.println("=================");

        list.stream().filter(e -> e > 60)
                .sorted((o1, o2) -> o2 - o1)
                        .limit(3)
                                .forEach(System.out::println);

        //需求5: 找出所有及格的分数, 倒序排列, 取前4-6名, 打印输出
        System.out.println("=================");


        list.stream().filter(e -> e > 60)
                .sorted((o1, o2) -> o2 - o1)
                        .skip(3)
                                .limit(3)
                                        .forEach(System.out::println);
        //需求6:  找出所有及格的分数, 倒序排列, 取前4-6名, 将每个人的分数加10分, 打印输出
        System.out.println("=================");

        list.stream().filter(e -> e > 60)
                .sorted((o1, o2) -> o2 - o1)
                .skip(3)
                .limit(3)
                .map(e -> e + 10)
                .forEach(System.out::println);

        //需求7: 将下面两个集合中的元素进行合并去重
        System.out.println("=================");
        List<String> list1 = List.of("1","2","3","4");
        List<String> list2 = List.of("1","5","7","4");
        Stream.concat(list1.stream(),list2.stream())
                .distinct()
                .forEach(System.out::println);


    }
}

 Stream流常见终结方法

                     调用完成后,不会返回新Stream了,没法继续使用流了。 

 

public class Demo4 {
    public static void main(String[] args) {
        List<Student> list = List.of(
                new Student("玄奘", 60, 165.5),
                new Student("悟空", 50, 175.5),
                new Student("悟能", 55, 145.5),
                new Student("悟净", 40, 185.5)
        );

        //1. 打印出集合中所有元素

        list.stream().forEach(System.out::println);
        //2. 统计出身高不足170的人数

        Stream<Student> stream = list.stream().filter(e -> e.getHeight() < 170);
        long count = stream.count();
        System.out.println(count);
        //3. 请找出年龄最大的对象, 并输出(了解)

        Student student = list.stream()
                .max((o1, o2) -> o1.getAge() - o2.getAge())
                .get();
        System.out.println(student);
            //4. 请找出身高最低的对象, 并输出(了解)

        Student student2 = list.stream()
                .min((o1, o2) -> Double.compare(o1.getHeight(),o2.getHeight()))
                .get();
        System.out.println(student2);
    }
}

class Student {
    private String name;
    private int age;
    private double height;

    public Student() {
    }

    public Student(String name, int age, double height) {
        this.name = name;
        this.age = age;
        this.height = height;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", height=" + height +
                '}';
    }
}

 

Stream流转数组/集合 

public class Demo5 {
    public static void main(String[] args) {
        List<Teacher> list = List.of(
                new Teacher("玄奘", 60, 165.5),
                new Teacher("悟空", 50, 175.5),
                new Teacher("悟空", 50, 175.5),
                new Teacher("悟能", 55, 145.5),
                new Teacher("悟净", 40, 185.5));

        //1. 请找出身高超过170的教师, 并放到一个新数组中

        Object[] objects = list.stream()
                     .filter(e -> e.getHeight() > 170)
                     .toArray();
        System.out.println(Arrays.toString(objects));

       Teacher[] teacher =  list.stream()
                .filter(e -> e.getHeight() > 170)
                //len代表元素中的个数
                .toArray(len -> new Teacher[len]);
        System.out.println(Arrays.toString(teacher));
        //2. 请找出身高超过170的教师, 并放到一个新List集合中

        List<Teacher> list1 = list.stream()
                .filter(e -> e.getHeight() > 170)
                        .collect(Collectors.toList());
        System.out.println(list1);
        //3. 请找出身高超过170的教师, 并放到一个新Set集合中
        Set<Teacher> list2 = list.stream()
                .filter(e -> e.getHeight() > 170)
                        .collect(Collectors.toSet());
        System.out.println(list2);
        //4. 请找出所有的教师的姓名和身高, 放到一个新Map集合中
        
        Map<String,Double> map = list.stream()
                .distinct()
                .collect(Collectors.toMap(e -> e.getName(), e-> e.getHeight()));
        System.out.println(map);
    }
}

class Teacher {
    private String name;
    private int age;
    private double height;

    public Teacher() {
    }

    public Teacher(String name, int age, double height) {
        this.name = name;
        this.age = age;
        this.height = height;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Teacher teacher = (Teacher) o;
        return age == teacher.age && Double.compare(teacher.height, height) == 0 && Objects.equals(name, teacher.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age, height);
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", height=" + height +
                '}';
    }
}

Map集合

1.Map集合称为双列集合,一次需要存一对数据做为一个元素, 格式:{key1=value1 ,        key2=value2 , key3=value3 , ...}

2.Map集合的所有键是不允许重复的,但值可以重复,键和值是一一对应的,每一个键只能找到自己对应的值

Map集合体系

 

Map集合的实现类有哪些?各自的特点是? 

   1.HashMap: 无序,不重复

   2.LinkedHashMap: 有序,不重复

   3.TreeMap:排序,不重复 

 Map接口常用方法

 

Map集合三种遍历方式 

public class Demo2 {
    public static void main(String[] args) {
        //1. 创建map
        HashMap<String, String> map = new HashMap<>();
        map.put("001", "玄奘");
        map.put("002", "悟空");
        map.put("003", "悟能");
        map.put("004", "悟净");

        //2. 各种方式进行遍历
        test1(map);
        System.out.println("=================");
        test2(map);
        System.out.println("=================");
        test3(map);
    }

    //遍历方式1: 先获取Map集合全部的键,再通过遍历键来找值
    private static void test1(HashMap<String, String> map) {

        Set<String> set = map.keySet();
        for (String s : set) {
            System.out.println(s + map.get(s));
        }
    }

    //遍历方式2: 将map中的所有键值对放入一个set集合中, 然后遍历set集合拿到每个键值对, 再取里面的键值
    private static void test2(HashMap<String, String> map) {

        Set<Map.Entry<String, String>> entries = map.entrySet();

        for (Map.Entry<String, String> entry : entries) {
            System.out.println(entry.getKey() + entry.getValue());
        }
    }

    //遍历方式3: Lambda, 使用foreach(BiConsumer bc)
    private static void test3(HashMap<String, String> map) {

        map.forEach((k,v) -> System.out.println(k+v));
    }
}

Map集合案例 

 

现有字符串数组如下:
    String[] bookArr = {"《红楼梦》-曹雪芹","《西游记》-吴承恩","《三国演义》-罗贯中","《水浒传》-施耐庵"};
需求:
    请将字符串中的书名提取为Map集合的键,将作者提取为Map集合的值
    并使用三种不同方式,遍历Map集合打印键值对元素内容
public class Demo3 {
    public static void main(String[] args) {

        Map<String,String> map = new HashMap<>();
        String[] bookArr = {"《红楼梦》-曹雪芹","《西游记》-吴承恩","《三国演义》-罗贯中","《水浒传》-施耐庵"};
        for (String book : bookArr) {

            String[] split = book.split("-");
            map.put(split[0],split[1] );
        }

        System.out.println(map);

        Set<String> set = map.keySet();
        for (String key : set) {

            System.out.println(key + map.get(key));

        }
        System.out.println("----------------------------");
        Set<Map.Entry<String, String>> entries = map.entrySet();
        for (Map.Entry<String, String> entry : entries) {
            System.out.println(entry.getKey()+entry.getValue());
        }
        System.out.println("----------------------------");
        map.forEach((key , value) -> System.out.println(key+value));


    }
}

 HashMap底层原理

      和HashSet一样 :Day06List接口&Set接口&树-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_60388241/article/details/133930070?spm=1001.2014.3001.5501

LinkedHashMap

底层数据结构依然是基于哈希表实现的,只是每个键值对元素又额外的多了一个双链表的机制记录元素顺序(保证有序)。 

TreeMap 

public class Demo6 {
    private String put;

    public static void main(String[] args) {
        //创建集合
        Map<Teacher, String> map = new TreeMap<>((o1, o2) -> o1.getAge() - o2.getAge());
        map.put(new Teacher("张三", 21), "河北");
        map.put(new Teacher("李四", 20), "山东");
        map.put(new Teacher("王五", 19), "山西");
        map.put(new Teacher("赵六", 21), "河南");

        map.forEach((k, v) -> {
            System.out.println(k + "-----" + v);
        });
    }
}

class Teacher {
    private String name;
    private int age;

    public Teacher() {
    }

    public Teacher(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

 集合的嵌套

集合嵌套
    要求在程序中记住如下省份和其对应的城市信息,记录成功后,要求可以查询出湖北省的城市信息。

数据
    江苏省 = "南京市","扬州市","苏州市","无锡市","常州市"
    湖北省 = "武汉市","孝感市","十堰市","宜昌市","鄂州市"
    河北省 = "石家庄市","唐山市","邢台市","保定市","张家口市"

分析:
    定义一个Map集合,键用表示省份名称,值表示城市名称,注意:城市会有多个。 Map<String,List<String>>
    根据“湖北省”这个键获取对应的值展示即可。
public class Demo7 {
    public static void main(String[] args) {

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

        List<String> list = List.of("南京市","扬州市","苏州市","无锡市","常州市");
        List<String> list2 = List.of("石家庄市","唐山市","邢台市","保定市","张家口市");
        map.put("江苏省",list);
        map.put("河北省",list2);

        System.out.println(map);

    }
}

 Collections

  可变参数 

可变参数
    就是一种特殊形参,定义在方法、构造器的形参列表里,格式是:数据类型... 参数名称

优点
    特点:可以不传数据给它;可以传一个或者同时传多个数据给它;也可以传一个数组给它。
    好处:常常用来灵活的接收数据。

注意事项
    1. 可变参数在方法内部就是一个数组
    2. 一个形参列表中可变参数只能有一个
    3. 可变参数必须放在形参列表的最后面
public class Demo {

    public static void main(String[] args) {

        sum(1546);

    }

    //计算2个整数的和

    //计算3个整数的和

    //计算4个整数的和
	
	//计算n个整数的和

    public static void sum(int... a){

        for (int i : a) {
            System.out.println(i);
        }
    }
}

 Collections工具类

 

public class Demo {
    public static void main(String[] args) {

        List<Integer> list = new ArrayList<>();
        //static <T> boolean addAll(单列集合,可变参数)   批量添加元素
        Collections.addAll(list,1,2,100,3,45);
        System.out.println(list);
        //static void shuffle(List集合)    打乱List集合元素顺序,每次调用都会打乱

        Collections.shuffle(list);
        System.out.println(list);
        //static <T> void  sort(List集合)   List集合进行自然排序

        Collections.sort(list);
        System.out.println(list);
        //排自定义类对象,需要指定排序规则
        List<Student> stuList = new ArrayList<>();
        stuList.add(new Student("zhangsan", 18));
        stuList.add(new Student("wangwu", 22));
        stuList.add(new Student("zhaoliu", 21));
        stuList.add(new Student("lisi", 19));
        stuList.add(new Student("qianqi", 20));

        //static<T> void sort(List集合,比较器);List集合进行比较器排序

        Collections.sort(stuList,(o1, o2) -> o1.getAge() - o2.getAge());
        System.out.println(stuList);
    }
}


class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1128182.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习合集】标准化与池化合集 ->(个人学习记录笔记)

文章目录 标准化与池化1. 标准化/归一化1.1 归一化归一化的作用 1.2 标准化批标准化方法 Batch Normailzation标准化方法的对比自动学习标准化方法 2. 池化2.1 池化的作用2.2 常见的池化方法2.3 池化方法的差异2.4 池化的必要性 标准化与池化 1. 标准化/归一化 1.1 归一化 归…

django建站过程(3)定义模型与管理页

定义模型与管理页 定义模型[models.py]迁移模型向管理注册模型[admin.py]注册模型使用Admin.site.register(模型名)修改Django后台管理的名称定义管理列表页面应用名称修改管理列表添加查询功能 django shell交互式shell会话 认证和授权 定义模型[models.py] 模仿博客形式&…

kali查看wifi破解密码,实测有效

首先需要安装kali系统 这个系统是安装在虚拟机上的 还需要一个无线网卡(最好是kali系统免驱的 否则是无法识别的) 有着两个工具就可以pojie密码了 kali官网:Kali Linux | Penetration Testing and Ethical Hacking Linux Distribution 下载这里大家去比站上或者博客都可以…

某雀服务器崩溃,引发数据安全性讨论,应该选择私有化部署吗?

随着云计算技术的飞速发展&#xff0c;越来越多的企业和个人选择将数据存储于云端。然而&#xff0c;云服务的稳定性和数据安全性问题也成为了用户关注的焦点。昨天下午&#xff0c;语雀服务器崩溃事件引起了广泛关注。这一事件再次凸显了私有化的重要性。又一批人群开始考虑将…

12 结构型模式-桥接模式

1 桥接模式介绍 2 桥接模式原理

跟人一样,手机太烫也会“生病”!如何给太烫的手机降温

高温是你手机最大的敌人。现代智能手机在纤薄的外壳中装有强大的处理器和大容量电池&#xff0c;即使在正常工作条件下&#xff08;看看你&#xff0c;Galaxy Note 7&#xff0c;也许还有iPhone 15&#xff09;&#xff0c;过热也会成为一个真正的问题。无论是充电、闲置还是执…

【每天学习一点新知识】安全设备IDS、IRS、IPS

IDS&#xff1a;入侵检测系统 对那些异常的、可能是入侵行为的数据进行检测和报警&#xff0c;告知使用者网络中的实时状况&#xff0c;并提供相应的解决、处理方法&#xff1b;是一种侧重于风险管理的安全产品。 IRS&#xff1a;入侵响应系统 深入网络数据内部&#xff0c;查…

项目结束需要经历的5个关键步骤

项目结束是项目管理不可或缺的一部分。这是项目的最后阶段&#xff0c;根据关键绩效指标和范围对交付成果进行测试&#xff0c;收尾&#xff0c;总结经验教训&#xff0c;完成交接&#xff0c;并签署项目。 项目结束与启动会议和一样重要。管理人员应为此留出时间&#xff0c;…

【剑指Offer】:循环有序列表的插入(涉及链表的知识)

给定循环单调非递减列表中的一个点&#xff0c;写一个函数向这个列表中插入一个新元素 insertVal &#xff0c;使这个列表仍然是循环升序的 给定的可以是这个列表中任意一个顶点的指针&#xff0c;并不一定是这个列表中最小元素的指针 如果有多个满足条件的插入位置&#xff0c…

从VTI7064与W25Qxx了解SPI通信协议

在学习过程中记录。 学习背景 最近在做的项目需要设计电路包含外扩FLASH&#xff08;W25Q128&#xff09;与SRAM(VTI7064)&#xff0c;二者都用到了SPI通信协议&#xff0c;之前没学过&#xff0c;学习记录一下。 顺便说一下这次学习中发现的好用工具WPS AI。可以对文档进行…

Leetcode周赛368补题(3 / 3)

目录 1、元素和最小的山型三元组 | - 三层for暴力循环 2、元素和最小的山型三元组 || - 维护前后最小值 遍历 3、合法分组的最少组数 - 思维 哈希表 1、元素和最小的山型三元组 | - 三层for暴力循环 100106. 元素和最小的山形三元组 I class Solution {public int minimu…

Linux流量监控

yum install -y iptrafiptraf-ng -d ens33

centos7磁盘动态扩容

1.查看磁盘空间 df -h 2.fdisk -l 查看当前的磁盘分区信息(主要是分区表信息) linux新增磁盘后&#xff0c;用fdisk等命令查询不到 #ls /sys/class/scsi_host/ &#xff08;会看到有host0、host1…hostN&#xff0c;对每个host进行如下操作&#xff09; echo “- - -” …

IP证书针对公网IP签发

很多项目应用需要采用IP地址数据桥接访问&#xff0c;这种情况下需要确保数据安全性及信任不被劫持的情况下&#xff0c;需要使用给IP地址增加数字证书进行保护。针对这种情况下我们对公网IP地址申请SSL证书做了详细的介绍&#xff0c;让我们可以更快地了解如何用IP地址去申请S…

sknearl-7处理文本数据

本章代码大部分没跑&#xff0c;只供学习 第四节特征工程里提到&#xff0c;有连续特征和离散特征&#xff0c;对于文本数据&#xff0c;文本特征可以看作第三种特征 1 用字符串表示的数据类型 2 例子 电影评论情感分析 给定一个影评&#xff08;输入&#xff09;&#xff…

Spring Boot配置 application.yml,根据application.yml选择启动配置

在Spring Boot 中可以选择applicant.properties 作为配置文件&#xff0c;也可以通过在application.yml中进行配置&#xff0c;让Spring Boot根据你的选择进行加载启动配置文件。 这种配置方式&#xff0c;我们通常在实际开发中经常使用&#xff0c;主要为了发布版本和以及开发…

ATFX汇市:美元指数跌破关键支撑,黄金触及2000关口后回落

ATFX汇市&#xff1a;昨日&#xff0c;在没有重磅数据公布的情况下&#xff0c;美元指数大跌0.52%&#xff0c;最低触及105.51&#xff0c;令市场人士感到意外。美元指数与美债价格呈反向波动关系&#xff1a;美联储加息&#xff0c;美债价格下跌&#xff08;收益率提高&#x…

清华训练营悟道篇之操作系统的调用接口

文章目录 API与ABI系统调用接口的功能 API与ABI API (Application Programming Interface)定义了源码级&#xff08;如 C 语言&#xff09;函数的参数&#xff0c;参数的类型&#xff0c;函数的返回值等。API 是用来约束编译器 (Compiler) 的&#xff0c;给编译器的一些指令&a…

女孩子就是要打扮漂亮,让童年不留遗憾

好的衣服当然要分享给好看的人啦&#xff01; 百搭圆领卫衣&#xff0c;经典版型不挑人穿 复合奥利绒面料&#xff0c;罗纹收口设计 时尚百搭怎么穿都好看 单穿内搭都可以 卡通鹅真的好可爱 宝贝穿上去真的元气满满哦

Verilog功能模块——读写位宽不同的同步FIFO

FIFO系列文章目录&#xff1a; Verilog功能模块——异步FIFO-CSDN博客 Verilog功能模块——同步FIFO-CSDN博客 Verilog功能模块——读写位宽不同的异步FIFO-CSDN博客 Verilog功能模块——读写位宽不同的同步FIFO-CSDN博客 Verilog功能模块——标准FIFO转FWFT FIFO-CSDN博客…