Stream流式思想

什么是Stream?

也叫Stream流,是Jdk8开始新增的一套API (java.util.stream.*),可以用于操作集合或者数组的数据。
优势: Stream流大量的结合了Lambda的语法风格来编程,提供了一种更加强大,更加简单的方式操作集合或者数组中的数据,代码更简洁,可读性更好。

要使用Stream流,先检查自己电脑上配置的jdk版本是否在8以上,不是的话该更新了哦,Stream尊嘟好好玩。

jdk17下载链接在这里的呢,https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.msi

体验Stream流

List<String> list = new ArrayList<>();
list.add("张无忌");
list.add("周芷若");
list.add("赵敏");
list.add("张强");
list.add("张三丰");

要求是,把 list集合中所有以“张”开头,且是3个字的元素存储到一个新的集合当中。

  • 解题分析:我们先来分析一下题意,1、以张开头的姓名 2、姓名是三个字

  • list集合调用stream()方法转为Stream流,再调用Stream流的相关方法

  • filter筛选出符合条件的对象,collect()方法收集生成的对象,Collectors.toList()把收集后的对象存储到List集合当中

  • List<String> names = new ArrayList<>();Collections.addAll(names, "张三丰", "张无忌", "周芷若", "赵敏", "张强");// 开始使用Stream流来解决这个需求。List<String> newNames = names.stream().filter(name -> name.startsWith("张") && name.length() == 3).collect(Collectors.toList());System.out.println("newNames = " + newNames);System.out.println("---------------------------------------");//不想存储到集合的话,也可以直接调用foreach方法,直接输出,效果等同names.stream().filter(name -> name.startsWith("张") && name.length() == 3).forEach(System.out::println);
    

除了用传统方法逐个进行添加之外,我们也可以直接使用 Collections工具类,调用addAll方法进行添加String对象

比如,介样子 List names = new ArrayList<>();
Collections.addAll(names, “张三丰”, “张无忌”, “周芷若”, “赵敏”, “张强”);

Stream流的常用方法

       TreeMap<String, ArrayList<String>> citys = new TreeMap<>();ArrayList<String> su = new ArrayList<>();ArrayList<String> e = new ArrayList<>();ArrayList<String> ji = new ArrayList<>();Collections.addAll(su, "南京", "扬州", "苏州", "无锡", "常州");Collections.addAll(e, "武汉市", "孝感市", "十堰市", "宜昌市", "鄂州市");Collections.addAll(ji, "石家庄市", "唐山市", "邢台市", "保定市", "张家口市");citys.put("江苏省", su);citys.put("湖北省", e);citys.put("河北省", ji);ArrayList<String> strings = citys.get("湖北省");strings.forEach(System.out::println);//迭代器遍历查找,根据键找值,再逐层进行筛选Set<Map.Entry<String, ArrayList<String>>> entries = citys.entrySet();Iterator<Map.Entry<String, ArrayList<String>>> iterator = entries.iterator();while (iterator.hasNext()) {Map.Entry<String, ArrayList<String>> next = iterator.next();String key = next.getKey();//找到合适的键,进行匹配,符合要求之后输出键对应的值if (key.equals("湖北省")) {ArrayList<String> nextValue = next.getValue();nextValue.forEach(System.out::println);}}Set<String> strings1 = citys.keySet();ArrayList<String> strings2 = citys.get("江苏省");
//Steam流式思想,调用双层forEach方法,逐级调用里面的对象元素citys.forEach((key, city) -> {System.out.print(key + ":");city.forEach(System.out::println);});}
}

Stream流的使用步骤

  • 获取Stream流,Stream流代表一条流水线,并能与数据源建立连接。
  • 调用流水线的各种方法对数据进行处理、计算。
  • 获取处理的结果,遍历、统计、收集到一个新集合中返回

1、Stream是什么?有什么作用? 结合了什么技术?
简化集合、数组操作的API。结合了Lambda表达式。

2、说说Stream流处理数据的步骤是什么?
先得到集合或者数组的Stream流。
然后调用Stream流的方法对数据进行处理。
获取处理的结果。

Stream流训练:

把集合中所有以“张”开头,且是3个字的元素存储到一个新的集合

//concat 拼接方法Stream<String> str1 = Stream.of("A", "B", "C");Stream<String> str2 = Stream.of("1", "2", "3");//拼接流str1和str2Stream.concat(str1,str2).forEach(System.out::println);
//拼接流str1和str2List<String> collect = Stream.concat(Stream.of(names), Stream.of(signal)).collect(Collectors.toList());collect.stream().forEach(System.out::println);

获取Stream流

  • Collection提供了专门的集合对象Stream流获取方法,default Stream stream()

  • 获取 集合 的Stream流

    • List<String> list = new ArrayList<>();
      Stream<String> stream = names.stream();//集合直接调用stream()方法,获取Stream流
      
  • 获取 数组 的Stream流

    • 数组获取Stream流的方式有两种,使用Arrays类和Stream类

    • Arrays类提供的Stream方法获取当前数组的Stream流

    • Stream类提供的方法of(T… values)获取当前接收数据的Stream流

    • int[] a = {1, 2, 3, 4, 5, 6};
      String[] str = new String[]{"A", "B", "C"};
      //public static <T> Stream<T> stream(T[] array)  
      Arrays.stream(a).forEach(System.out::println);//先转为Stream流,才可以调用Stream流里面的相关方法
      //public static<T> Stream<T> of(T... values)
      Stream.of(str).forEach(System.out::println);
      

Stream流常见的中间方法

  • 中间方法指的是调用完成后会返回新的Stream流,可以继续使用(支持链式编程)。

  • Stream<T> filter(Predicate<? super T> predicate)            //用于对流中的数据进行过滤。       
    Stream<T>sorted()                                           //对元素进行升序排序               
    Stream<T> sorted(Comparator<? super T> comparator)          //按照指定规则排序                
    Stream<T>limit(long maxSize)                                //获取前几个元素                  
    Stream<T> skip(long n)                                      //跳过前几个元素                  
    Stream<T> distinct()                                        //去除流中重复的元素。             
    <R> Stream<R> map(Function<? super T,? extends R> mapper)   //对元素进行加工,并返回对应的新流 
    static <T> Stream<T> concat**(Stream a, Stream b)           //合并a和b两个流为一个流           
    

Stream常见的终结方法

  • 终结方法指的是调用完成后,不会返回新Stream了,没法继续使用流了。

  • void forEach(Consumer action)							//对此流运算后的元素执行遍历
    long count()										   //统计此流运算后的元素个数
    Optional<T> max(Comparator<? super T> comparator)          //获取此流运算后的最大值元素
    Optional<T> min(Comparator<? super T> comparator)          //获取此流运算后的最小值元素
    

Stream流常见方法、中间方法、终结方法的综合实战

  • 实战目标:掌握Stream流提供的常见、中间、终结方法。

  • 前期数据准备

    • import java.util.Objects;
      public class Student {//学生类private String name;//姓名private int age;//年龄private double height;//身高private String sex;//性别private String address;//家庭地址@Overridepublic String toString() {return "学生姓名:" + name + ", 年龄:"+ age + ", 身高:" + height + ", 性别:" + sex + ", 家庭住址:" + address +'。';}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public Student() {}public Student(String name, int age, double height,String sex,String address) {this.name = name;this.age = age;this.height = height;this.sex = sex;this.address = address;}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;Student student = (Student) o;return Objects.equals(name, student.name);}@Overridepublic int hashCode() {return Objects.hash(name);}
      }
      
    • Student s1 = new Student("林风", 26, 172.5,"男","苏州市");
      Student s2 = new Student("赵琳", 26, 162.5,"女","兰州市");
      Student s3 = new Student("音音", 23, 160.6,"女","西安市");
      Student s4 = new Student("姜维", 25, 169.0,"男","天水市");
      Student s5 = new Student("林锋", 35, 183.3,"女","深圳市");
      Student s6 = new Student("李广", 34, 168.5,"男","天水市");
      

    训练1:已知如下数据,找出成绩大于等于60分的数据,并升序后,再输出。

    • List<Double> scores = new ArrayList<>();
      Collections.addAll(scores, 88.5, 100.0, 60.0, 99.0, 9.5, 99.6, 25.0);
      
    • 解题过程:

      • // 因为分数是double类型,排序的时候直接调用double的封装类Double进行排序scores.stream().filter(score->(score>=60)).sorted((o1,o2)->Double.compare(o1,o2)).forEach(System.out::println);
        

    训练2:已知students学生集合,找出年龄大于等于23,且年龄小于等于30岁的学生,并按照年龄降序输出.

    • 解题过程:

      students.stream().filter(student -> student.getAge()>=23&&student.getAge()<=30).sorted(((o1,o2)-> Integer.compare(o2.getAge(),o1.getAge()))).forEach(System.out::println);//首先转换为stream流,然后调用filter进行筛选,再降序最后打印输出列表内容,严格按照题意
      

    训练3:已知students学生集合,取出身高最高的前3名学生,并输出。

    • 解题过程

          students.stream().sorted(((o1,o2)-> Double.compare(o2.getHeight(),o1.getHeight()))).limit(3).forEach(System.out::println);
      

    训练4:取出身高倒数2名学生,并输出学生信息。

    • 解题过程

      students.stream().sorted(((o1,o2)-> Double.compare(o1.getHeight(),o2.getHeight()))).limit(2).forEach(System.out::printn);
      

    训练5:找出身高超过168的学生叫什么名字,要求去除重复的名字,再输出。

    • 解题过程

      students.stream().filter(student -> student.getHeight()>=168).map(stu->stu.getName())// 使用Map方法将学生对象转换为名字数据.distinct()//名字字符串的去重.forEach(System.out::println);
      /**distinct去重复,自定义类型的对象(希望内容一样就认为重复,重写hashCode,equals)学生集合中的数据是学生对象,要求获取学生的名字,并且去重输出。如何在Stream中将Student数据转换为String数据? 可以使用map方法完成转换**/
      

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

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

相关文章

从 Blender 导出动画视频

Blender Tutorial - How To Export Video Files 要导出编辑完的视频&#xff0c;你需要先设置好输出的格式、分辨率、帧率、位置等参数&#xff0c;然后选择渲染动画的选项&#xff0c;等待渲染完成后&#xff0c;你就可以在指定的位置找到生成的视频文件。 具体步骤如下&…

Python 列表 sort()函数使用详解

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 sort函数使用详解 1、升序降序2、sort()和sorted()的区别3、切片排序4、指定排序…

vue封装短信验证码,刷新缓存倒计时

HTML代码 <a-form-item field"verifyCode" label"验证码:"><a-input v-model"formData.verifyCode" placeholder"短信验证码" class"login-form-button" allow-clear><template #append><span:class&q…

TypeScript笔记

文章目录 什么是TS前期准备安装TSTS配置文件 基础类型原始类型 object类型 数组类型 元组类型 枚举 函数类型可选参数和默认参数剩余参数 any任意类型 高级类型交叉类型联合类型 接口类泛型类型别名参考 什么是TS 官网介绍&#xff1a;TypeScript是JavaScript类型的超集&#…

力扣160. 相交链表

题目 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。题目数据保证整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&#xff0c;链表必须保持其原始结构。 链接&am…

深度学习项目四:创建自定义数据集的dataset, DataLoader

深度学习项目四:创建自定义数据集的dataset, DataLoader 文章目录 深度学习项目四:创建自定义数据集的dataset, DataLoader前言一、构建dataset基本类二、创建train_dataset,test_dataset及相应DataLoader1.数据集的index创建2.创建自定义dataset类3.划分训练集和测试集,创建…

Qt应用程序性能优化总结

在Qt中进行性能优化时&#xff0c;可以考虑以下建议来提高应用程序的性能&#xff1a; 1. 使用合适的数据结构&#xff1a;选择适当的数据结构对于提高性能至关重要。例如&#xff0c;使用QList而不是QVector来存储大量数据时&#xff0c;可以提高插入和删除的性能。另外&…

飞书ChatGPT机器人 – 打造智能问答助手实现无障碍交流

文章目录 前言环境列表1.飞书设置2.克隆feishu-chatgpt项目3.配置config.yaml文件4.运行feishu-chatgpt项目5.安装cpolar内网穿透6.固定公网地址7.机器人权限配置8.创建版本9.创建测试企业10. 机器人测试 前言 在飞书中创建chatGPT机器人并且对话&#xff0c;在下面操作步骤中…

Flask结合gunicorn和nginx反向代理的生产环境部署及踩坑记录

个人博客&#xff1a;https://xzajyjs.cn 前言 之前自己写的flask使用gunicorn上线生产环境没有什么问题&#xff0c;但是最近搭建了一个现成的flask项目&#xff0c;当使用python直接运行时不会有问题&#xff0c;而使用gunicorn时则会出现一些问题。 部署过程 运行测试 这…

听GPT 讲K8s源代码--pkg(一)

在 Kubernetes 代码仓库中&#xff0c;pkg/api和pkg/apis目录都包含用于定义 Kubernetes API 对象的代码&#xff0c;但它们的作用略有不同。 pkg/api目录包含 Kubernetes 的旧版本 API 对象定义&#xff0c;这些定义在 Kubernetes 1.7 版本之前使用。这些对象定义已经过时&…

k8s 持久化存储

我们继续来查看 k8s 的卷&#xff0c;上一次我们分享了将磁盘挂载到容器中&#xff0c;empyDir 和 gitRepo 都是会随着 pod 的启动而创建&#xff0c;随着 pod 的删除而销毁 那么我们或许会有这样的需求&#xff0c;期望在 pod 上面读取节点的文件或者使用节点的文件系统来访问…

Spring Boot 中的 Redis 的数据操作配置和使用

Spring Boot 中的 Redis 的数据操作配置和使用 Redis 是一种高性能的 NoSQL 数据库&#xff0c;它支持多种数据结构&#xff0c;包括字符串、哈希、列表、集合和有序集合。Redis 还提供了丰富的命令&#xff0c;可以对数据进行快速的 CRUD 操作。Spring Boot 是一个基于 Sprin…

基于单片机智能加湿器 水位防干烧加湿器的设计与实现

功能介绍 以51/STM32单片机作为主控系统&#xff1b;LCD1602液晶显示当前温湿度&#xff0c;当前模式&#xff0c;湿度下限;按键设置湿度下限&#xff0c;当湿度低于下限时开启加湿器;水位传感器检查加湿器是否有水&#xff0c;如果没有水到话加湿器不进行工作&#xff0c;蜂鸣…

【golang函数笔记】

目录 01定义和调用函数1. 函数的参数2. 函数的返回值3. 函数的变参4. 匿名函数 Golang是一种支持函数式编程的语言&#xff0c;它的函数具有以下特点&#xff1a; 函数是一等公民&#xff1a;函数可以作为参数传递给其他函数&#xff0c;也可以作为返回值返回给调用者。 支持多…

怎么用PDF24 Tools工具在线进行PDF文件合并

PDF文件是经常会被用到&#xff0c;它在我们的日常生活和工作中扮演着重要的角色。PDF文件合并是将多个PDF文件合并为单个文件&#xff0c;这个过程通常是为了方便管理多个PDF文件&#xff0c;或者将多个PDF文件合并为一个整体以便于共享或打印。既然如此&#xff0c;如何快速合…

kotlin forEach循环return/break

kotlin forEach循环return/break fun main(args: Array<String>) {var a mutableListOf("0", "1", "2", "3", "4")var b mutableListOf<String>()a.forEachIndexed { index, s ->if (index > 2) {retu…

【Mac使用笔记】之 Homebrew

Homebrew更新&#xff1a; brew update && brew upgrade 当出现错误&#xff1a; fatal: couldnt find remote ref refs/heads/master 执行&#xff1a; brew tap --repair Ruby安装&#xff1a; 1、查看当前Homebrew版本&#xff1a; brew --version2、查看当前…

libbpf-bootstrap 开发指南:概念与如何安装

目录 概念 如何安装& 使用 git 地址 使用git clone 下载代码 安装依赖环境 安装libbpf 编译example 概念 libbpf-bootstrap 是一个项目&#xff0c;旨在帮助开发者快速启动和开发使用 eBPF (Extended Berkeley Packet Filter) 和 libbpf 的程序。eBPF 是一种可以在…

TTX1994-可调谐激光器控制系统

花了两周时间&#xff0c;利用下班时间&#xff0c;设计了一个ITLA可调谐激光器控制系统&#xff0c;从硬件到软件。下面这个图片整套硬件系统&#xff0c;软件硬件都自己设计&#xff0c;可以定制&#xff0c;做到单片机问题也不大。相当于一套光源了 这是软件使用的界面&…

Kafka 概述、Filebeat+Kafka+ELK

Kafka 概述、FilebeatKafkaELK 一、为什么需要消息队列&#xff08;MQ&#xff09;1、使用消息队列的好处2、消息队列的两种模式 二、Kafka 定义1、Kafka 简介2、Kafka 的特性3、Kafka 系统架构 三、部署 kafka 集群1.下载安装包2.安装 Kafka3.Kafka 命令行操作 四、Kafka 架构…