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

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 -> emap.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;}@Overridepublic 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;}@Overridepublic 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);}@Overridepublic int hashCode() {return Objects.hash(name, age, height);}@Overridepublic 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. 创建mapHashMap<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;}@Overridepublic 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;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}

 

 

 

 

 

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

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

相关文章

面试算法40:矩阵中的最大矩形

题目 请在一个由0、1组成的矩阵中找出最大的只包含1的矩形并输出它的面积。例如&#xff0c;在图6.6的矩阵中&#xff0c;最大的只包含1的矩阵如阴影部分所示&#xff0c;它的面积是6。 分析 直方图是由排列在同一基线上的相邻柱子组成的图形。由于题目要求矩形中只包含数字…

SpringCloud微服务 【实用篇】| 认识微服务

目录 一&#xff1a;认识微服务 1. 微服务框架介绍 2. 服务架构演变 3. 微服务技术对比 4. SpringCloud 图书推荐&#xff1a;《巧用ChatGPT快速提高职场晋升力》 一&#xff1a;认识微服务 本课程学习于黑马&#xff0c;会通过分层次学习&#xff0c;分为三部分去讲解微…

数据与视图的完美契合:Vue响应式的交织魅力

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

springboo单机多线程高并发防止重复消费的redis方案

springboo单机多线程高并发防止重复消费的redis方案 仅提供方案与测试。 想法&#xff1a;第一次收到userCode时&#xff0c;检查是否在redis中有&#xff0c;如果有&#xff0c;就表明已经消费了&#xff0c;返回抢单失败&#xff1b;否则&#xff0c;就去消费&#xff0c;顺…

从REST到GraphQL:升级你的Apollo体验

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

Qt之实现支持多选的QCombobox

一.效果 1.点击下拉列表的复选框区域 2.点击下拉列表的非复选框区域 二.实现 QHCustomComboBox.h #ifndef QHCUSTOMCOMBOBOX_H #define QHCUSTOMCOMBOBOX_H#include <QLineEdit> #include <QListWidget> #include <QCheckBox> #include <QComboBox>…

R语言生物群落(生态)数据统计分析与绘图

R 语言作的开源、自由、免费等特点使其广泛应用于生物群落数据统计分析。生物群落数据多样而复杂&#xff0c;涉及众多统计分析方法。以生物群落数据分析中的最常用的统计方法回归和混合效应模型、多元统计分析技术及结构方程等数量分析方法为主线&#xff0c;通过多个来自经典…

计算机算法分析与设计(14)---贪心算法(会场安排问题和最优服务次序问题)

文章目录 一、会场安排问题1.1 问题描述1.2 思路分析1.3 例题分析1.4 代码编写 二、最优服务次序问题2.1 问题描述2.2 思路分析2.3 代码编写 一、会场安排问题 1.1 问题描述 假设在足够多的会场里安排一批活动&#xff0c;并希望使用尽可能少的会场。设计一个有效的贪心算法进…

十八、字符串(3)

本章概要 正则表达式 基础创建正则表达式量词CharSequencePattern 和 Matcherfinde()组&#xff08;Groups&#xff09;start() 和 end()Pattern 标记split()替换操作reset()正则表达式与 Java I/0 正则表达式 很久之前&#xff0c;_正则表达式_就已经整合到标准 Unix 工具…

python网络爬虫实例

目录 1、访问百度 2、输入单词百度翻译 3、豆瓣电影排行榜 4、豆瓣电影top250 5、下载美女壁纸 1、访问百度 from urllib.request import urlopen url"http://www.baidu.com" respurlopen(url)with open("mybaidu.html",mode"w") as f:f.wr…

ilr normalize isometric log-ratio transformation

visium_heart/st_snRNAseq/05_colocalization/create_niches_ct.R at 5b30c7e497e06688a8448afd8d069d2fa70ebcd2 saezlab/visium_heart (github.com) 更多内容&#xff0c;关注微信&#xff1a;生信小博士 The ILR (Isometric Log-Ratio) transformation is used in the anal…

Maven 生命周期clean default size含义

clean 负责清理工作&#xff0c;清理上一次项目构建产生的一些文件&#xff0c;如编译后的字节码文件&#xff0c;打包后的jar包文件 default 整一个项目构建的核心工作&#xff0c;如编译&#xff0c;测试&#xff0c;打包&#xff0c;安装&#xff0c;部署等等 size 生成报告…

CLion使用SSH远程连接Linux服务器

最近要一直用实验室的服务器写Linux下的C代码, 本来一直用VScode(SSH)连接服务器, 但是我以前还是用JetBrains的IDE用的多, 毕竟他家的IDE代码提示和功能在某些细节上更加丰富。所以这次我使用了Clion里的远程连接(同样也是SSH工具)连接上了我的服务器, 实现了和VScode上同样的…

【FPGA零基础学习之旅#17】搭建串口收发与储存双口RAM系统

&#x1f389;欢迎来到FPGA专栏~搭建串口收发与储存双口RAM系统 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0…

Linux 开机启动一条PHP命令

当你开机的时候要自动的启动一条PHP命令场景&#xff1a;比如webman 你需要手动启动项目进程 你可以这样操作 流程&#xff1a; 1、准备好你要执行的命令 2、将命令写入一个服务文件 3、开机自启这个服务 实例&#xff1a; 1、比如这个命令 /usr/local/php/bin/php /ho…

Docker:创建主从复制的Redis集群

一、Redis集群 在实际项目里&#xff0c;一般不会简单地只在一台服务器上部署Redis服务器&#xff0c;因为单台Redis服务器不能满足高并发的压力&#xff0c;另外如果该服务器或Redis服务器失效&#xff0c;整个系统就可能崩溃。项目里一般会用主从复制的模式来提升性能&#x…

CouchDB简单入门

CouchDB 1.curl命令 RESTful 新增&#xff1a;POST请求修改&#xff1a;PUT请求删除&#xff1a;DELETE请求查找&#xff1a;GET请求 查看数据库有哪些 curl -X GET http://admin:123456localhost:5984/_all_dbsadmin: 用户名 123456:改成自己密码 创建数据库 curl -X PU…

《语音优先》智能语音技术驱动的交互界面设计与语音机器人设计(译者序)...

“言为心声,语为心境”&#xff0c;语言与对话是我们沟通与协作的重要方式。而智能语音技术是一种基于人工智能和自然语言处理技术的语音交互技术。它可以通过语音识别技术将用户的语音指令转换为文本&#xff0c;然后通过自然语言处理技术对文本进行分析和理解&#xff0c;最终…

WIN11+OPENCV4.8 编译及下载失败处理方法

1. 基础准备 1. 下载Opencv和Contrib库 Opencv&#xff1a;Releases opencv/opencv GitHub Contrib&#xff1a;Tags opencv/opencv_contrib GitHub 2. 安装Visual Studio 或 MinGW64 MinGW&#xff1a;Tags opencv/opencv_contrib GitHub 这里安装1.12.0 MinGW 。 以…

flutter 使用FlutterJsonBeanFactory工具遇到的问题

如下图&#xff0c;使用FlutterJsonBeanFactory工具生成的数据类 但是其中 生成的 import package:null/&#xff0c;导致的错误&#xff1a;Target of URI doesn’t exist: ‘package:null/generated/json/asd.g.dart’ 尝试过的方法&#xff1a; 手动添加包名&#xff0c;…