Java基础_Stream流

Java基础_Stream流

  • Stream流的简单使用
  • Stream流的获取
  • Stream流的中间方法
  • Stream流的终结方法
  • 综合练习
    • 数字过滤
    • 字符串过滤并收集
    • 自定义对象过滤并收集
  • 来源
  • Gitee地址

Stream流的简单使用

public class StreamDemo01 {public static void main(String[] args) {/*** 创建集合添加元素,完成以下需求:* 1.把所有以“张”开头的元素存储到新集合中* 2.把“张”开头的,长度为3的元素再存储到新集合中* 3.遍历打印最终结果*/ArrayList<String> list = new ArrayList<>();list.add("张无忌");list.add("周芷若");list.add("赵敏");list.add("张强");list.add("张三丰");list.stream().filter(name -> name.startsWith("张")).filter(name -> name.length() == 3).forEach(name -> System.out.println(name));// ArrayList<String> list1 = new ArrayList<>();// for (String name : list) {//     if(name.startsWith("张")){//         list1.add(name);//     }// }//// ArrayList<String> list2 = new ArrayList<>();// for (String name : list1) {//     if(name.length() == 3){//         list2.add(name);//     }// }//// for (String name : list2) {//     System.out.println(name);// }}
}

Stream流的获取

在这里插入图片描述

  • 单列集合
    public class StreamDemo2 {public static void main(String[] args) {/*** 单列集合获取Stream流*/ArrayList<String> list = new ArrayList<>();Collections.addAll(list, "a", "b", "c", "d", "e");// list.stream().forEach(new Consumer<String>() {//     @Override//     public void accept(String s) {//         System.out.println(s);//     }// });list.stream().forEach(s -> System.out.println(s));}
    }
    
  • 双列集合
    public class StreamDemo3 {public static void main(String[] args) {/*** 双列集合获取Stream流*/HashMap<String, Integer> map = new HashMap<String, Integer>();map.put("aaa", 111);map.put("bbb", 222);map.put("ccc", 333);map.put("ddd", 444);map.keySet().stream().forEach(key -> System.out.println(key));map.entrySet().stream().forEach(entry -> System.out.println(entry));}
    }
    
  • 数组
    public class StreamDemo4 {public static void main(String[] args) {/*** 数组获取Stream流*/int[] arr1 = {1, 2, 3, 4};String[] arr2 = {"a", "b", "c", "d"};Arrays.stream(arr1).forEach(num -> System.out.println(num));Arrays.stream(arr2).forEach(str -> System.out.println(str));/*** 注意:* Stream接口中静态方法of的细节* 方法的形参是一个可变参数,可以传递一堆零散的数据,也可以传递数组* 但是数组必须是引用数据类型的,如果传递基本数据类型,是会把整个数组当作一个元素,放到Stream中*/Stream.of(arr1).forEach(num -> System.out.println(num));//[I@448139f0Stream.of(arr2).forEach(str -> System.out.println(str));}
    }
    
  • 零散数据
    public class StreamDemo5 {public static void main(String[] args) {/*** 零散数据获取Stream流*/Stream.of(1, 2, 3, 4).forEach(num -> System.out.println(num));}
    }
    

Stream流的中间方法

在这里插入图片描述

  • 注意
    • 中间方法,返回新的Stream流,原来的Stream流只能用一次,建议使用链式编程
    • 修改Stream流中的数据,不会影响原来集合或者数组中的数据
  • filter,skip,limit
    public class StreamDemo6 {public static void main(String[] args) {/*** Stream流的中间方法* filter, skip, limit*/ArrayList<String> list = new ArrayList<>();Collections.addAll(list, "张无忌", "周芷若", "赵敏", "张强", "张三丰");// list.stream().filter(new Predicate<String>() {//     @Override//     public boolean test(String s) {//         return s.startsWith("张");//     }// }).forEach(s -> System.out.println(s));// filter 过滤System.out.println("filter");list.stream().filter(s -> s.startsWith("张")).forEach(s -> System.out.println(s));// limit 获取前几个元素System.out.println("limit");list.stream().limit(3).forEach(str -> System.out.println(str));// skip 跳过前几个元素System.out.println("skip");list.stream().skip(3).forEach(str -> System.out.println(str));// 练习:获取[2, 3]System.out.println("[2, 3]的元素为");list.stream().skip(2).limit(2).forEach(s -> System.out.println(s));}
    }
    
  • distinct,concat
    public class StreamDemo7 {public static void main(String[] args) {/*** distinct, concat*/ArrayList<String> list1 = new ArrayList<>();Collections.addAll(list1, "张无忌", "张无忌", "张无忌", "周芷若", "赵敏", "张强", "张三丰");ArrayList<String> list2 = new ArrayList<>();Collections.addAll(list2, "Tommy", "Jelly", "Mike");// distinct 元素去重,依赖hashCode和equals方法(底层是HashSet)list1.stream().distinct().forEach(s -> System.out.println(s));// concat 合并a和b为一个流System.out.println("concat");Stream.concat(list1.stream(), list2.stream()).forEach(s -> System.out.println(s));}
    }
    
  • map
    public class StreamDemo8 {public static void main(String[] args) {/*** map*/// map 转换流中的数据类型ArrayList<String> list = new ArrayList<>();Collections.addAll(list, "张无忌-18", "周芷若-19", "赵敏-21", "张强-23", "张三丰-27");/*** 第一个类型:流中原本的数据类型* 第二个类型:转换后的类型* apply的形参s:依次表视流里面的每一个数据* 返回值:表视转换之后的数据** map方法执行完毕之后,流上的数据就变成了整数*/// list.stream().map(new Function<String, Integer>() {//     @Override//     public Integer apply(String s) {//         String[] split = s.split("-");//         int age = Integer.parseInt(split[1]);//         return age;//     }// }).forEach(num -> System.out.println(num));list.stream().map(s -> {String[] split = s.split("-");int age = Integer.parseInt(split[1]);return age;}).forEach(num -> System.out.println(num));}
    }
    

Stream流的终结方法

在这里插入图片描述

  • forEach, count, toArray
    public class StreamDemo9 {public static void main(String[] args) {/*** forEach, count, toArray*/ArrayList<String> list = new ArrayList<>();Collections.addAll(list, "张无忌", "周芷若", "赵敏", "张强", "张三丰", "张翠山", "张良", "王二麻子", "谢广坤");System.out.println("forEach");// void forEach(Consumer action) 遍历// Consumer的泛型:表示流中数据的类型// accept方法的形参s:依次表视流里面的每一个数据// 方法体:对每一个数据的处理操作// list.stream().forEach(new Consumer<String>() {//     @Override//     public void accept(String s) {//         System.out.println(s);//     }// });list.stream().forEach(s -> System.out.println(s));System.out.println("count");// long count 统计System.out.println(list.stream().count());System.out.println("toArray");// toArray 收集流中的数据,放到数组中/* 1Object[] objects = list.stream().toArray();System.out.println(Arrays.toString(objects));*//* 2String[] arr1 = list.stream().toArray(new IntFunction<String[]>() {@Overridepublic String[] apply(int value) {return new String[value];}});System.out.println(Arrays.toString(arr1));*/String[] arr2 = list.stream().toArray(value -> new String[value]);System.out.println(Arrays.toString(arr2));}
    }
    
  • collect
    public class StreamDemo10 {public static void main(String[] args) {/*** collect*/ArrayList<String> list = new ArrayList<>();Collections.addAll(list, "张无忌-男-13", "张无忌-男-13", "周芷若-女-17", "赵敏-女-21", "张强-男-23", "张三丰-男-27", "张翠流-女-31", "张良-男-34", "王二麻子-男-37", "谢广坤-男-41");// collect(Collector collector) 收集流中的数据,放到集合中(List Set Map)// 收集男性System.out.println("toList");List<String> list1 = list.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toList());System.out.println(list1);System.out.println("toSet");Set<String> set = list.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toSet());System.out.println(set);System.out.println("toMap");// Map<String, Integer> map = set.stream()//         .filter(s -> "男".equals(s.split("-")[1]))//         .collect(Collectors.toMap(//                 new Function<String, String>() {//                     @Override//                     public String apply(String s) {//                         return s.split("-")[0];//                     }//                 },//                 new Function<String, Integer>() {//                     @Override//                     public Integer apply(String s) {//                         return Integer.parseInt(s.split("-")[2]);//                     }//                 }//         ));Map<String, Integer> map = set.stream().collect(Collectors.toMap(s -> s.split("-")[0],s -> Integer.parseInt(s.split("-")[2])));System.out.println(map);}
    }
    

综合练习

数字过滤

public class StreamDemo11 {public static void main(String[] args) {/*** 定义一个集合,并添加一些整数1,2,3,4,5,6,7,8,9,10* 过滤奇数,只留下偶数。* 并将结果保存起来*/ArrayList<Integer> list = new ArrayList<>();Collections.addAll(list, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);List<Integer> res = list.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());System.out.println(res);}
}

字符串过滤并收集

public class StreamDemo12 {public static void main(String[] args) {/*** 创建一个ArrayList集合,并添加以下字符串,字符串中前面是姓名,后面是年龄* “zhangsan,23"* “lisi,24”* "wangwu,25”* 保留年龄大于等于24岁的人,并将结果收集到Map集合中,姓名为键,年龄为值*/ArrayList<String> list = new ArrayList<>();Collections.addAll(list, "zhangsan,23", "lisi,24", "wangwu,25");Map<String, Integer> map = list.stream().filter(s -> Integer.parseInt(s.split(",")[1]) >= 24).collect(Collectors.toMap(s -> s.split(",")[0],s -> Integer.parseInt(s.split(",")[1])));System.out.println(map);}
}

自定义对象过滤并收集

public class StreamDemo13 {public static void main(String[] args) {/*** 现在有两个ArrayList集合* 第一个集合中:存储6名男演员的名字和年龄。* 第二个集合中:存储6名女演员的名字和年龄* 姓名和年龄中间用逗号隔开。比如:张三,23* 要求完成如下的操作:* 1,男演员只要名字为3个字的前两人* 2,女演员只要姓杨的,并且不要第一个* 3,把过滤后的男演员姓名和女演员姓名合并到一起* 4,将上一步的演员信息封装成Actor对象:* 5,将所有的演员对象都保存到List集合中。* 备注:演员类Actor,属性有:name,age* "蔡坤坤,24","叶齁咸,23","刘不甜,22","吴签,24","谷嘉,30","肖梁梁,27"* "赵小颖,35”,"杨颖,36","高元元,43","张天天,31","刘诗,35","杨小幂,33"*/ArrayList<String> list1 = new ArrayList<>();Collections.addAll(list1, "蔡坤坤,24", "叶齁咸,23", "刘不甜,22", "吴签,24", "谷嘉,30", "肖梁梁,27");ArrayList<String> list2 = new ArrayList<>();Collections.addAll(list2, "赵小颖,35", "杨颖,36", "高元元,43", "张天天,31", "刘诗,35", "杨小幂,33");Stream<String> stream1 = list1.stream().filter(s -> s.split(",")[0].length() == 3).limit(2);Stream<String> stream2 = list2.stream().filter(s -> s.split(",")[0].startsWith("杨")).skip(1);Stream<String> stream3 = Stream.concat(stream1, stream2);List<Actor> list = stream3.map(s -> {String[] arr = s.split(",");String name = arr[0];int age = Integer.parseInt(arr[1]);return new Actor(name, age);}).collect(Collectors.toList());System.out.println(list);}
}

来源

黑马程序员. 阿玮Java零基础

Gitee地址

https://gitee.com/yu-ba-ba-ba/awJava

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

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

相关文章

Ubuntu虚拟机使用纯命令行对根分区进行扩展

Ubuntu虚拟机使用纯命令行对根分区进行扩展 前排提示 因为Ubuntu再安装时&#xff0c;根分区是没有使用LVM进行磁盘管理的&#xff0c;所以如果想扩展根分区&#xff0c;我们不得不使用另外一种暴力的方法。简单来说就是利用fdisk删除原来的根分区再基于原来的起始块号重新建…

C++对象池设计与实现

目录 一、对象池简介 1.1 池化技术 1.2 什么是对象池 1.3 对象池分配策略 二、C new和delete运算符重载 三、实现一个对象池框架 3.1 策略接口 四、实现几种对象池的分配策略 4.1 数组策略 4.2 堆策略 ​编辑 4.3 栈策略 4.4 区块策略 一、对象池简介 1.1 池化技…

【CS.AL】八大排序算法 —— 快速排序全揭秘:从基础到优化

文章目录 1. 快速排序简介1.1 定义1.2 时间复杂度1.3 相关资源 2. 最优的Partition算法 &#x1f525;2.1 Introsort简介2.2 过程示例 3. 非递归快速排序3.1 实现 4. 递归快速排序4.1 实现 5. 有问题的Partition5.1 实现 6. 三中位数主元选择6.1 实现 7. 总结 1. 快速排序简介 …

新增FTP功能、支持添加Redis远程数据库,专业版新增网站监控和黑金主题,1Panel开源面板v1.10.10版本发布

2024年6月7日&#xff0c;现代化、开源的Linux服务器运维管理面板1Panel发布v1.10.10版本。 在这一版本中&#xff0c;1Panel新增了多项实用功能。社区版方面&#xff0c;新增了FTP功能、支持添加Redis远程数据库、支持设置压缩密码&#xff0c;并新增了清理镜像构建缓存的功能…

[ue5]建模场景学习笔记(5)——必修内容可交互的地形,交互沙(2)

1需求分析&#xff1a; 继续制作可交互沙子内容&#xff0c;前面我们已经让角色在指定区域留下痕迹&#xff0c;那么能否让区域移动起来&#xff0c;这样才能逐步满足角色走到哪里都能产生交互痕迹&#xff0c;满足更大的地图。 2.操作实现&#xff1a; 1.首先建立角色能产生…

翻译《The Old New Thing》- How do I obtain the computer manufacturer’s name?

How do I obtain the computer manufacturers name? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20081218-00/?p19783 Raymond Chen 2008年08月08日 如何获取计算机制造商的名字&#xff1f; 一位客户想要一种方法来确定计算机制造商的…

C# .NET 异步实现方式

一、异步编程模式 .NET 提供了执行异步操作的三种模式&#xff1a; 基于任务的异步模式 (TAP) &#xff0c;该模式使用单一方法表示异步操作的开始和完成。 TAP 是在 .NET Framework 4 中引入的。 这是在 .NET 中进行异步编程的推荐方法。 C# 中的 async 和 await 关键词以及 …

HTML+CSS+JS 密码灯登录表单

效果演示 实现了一个登录页面,包括一个标题、两个输入框(用户名和密码)、一个登录按钮和一个眼睛图标。点击眼睛图标可以显示或隐藏密码。页面背景有两个圆形的半透明元素,整个页面使用了flex布局,并且在水平和垂直方向上都居中对齐。登录框使用了阴影效果和圆角边框,并且…

linux centos redis-6.2.6一键安装及配置密码

linux centos redis-6.2.6一键安装及配置密码 redis基本原理一、操作阶段&#xff0c;开始安装 redis基本原理 redis作为非关系型nosql数据库&#xff0c;一般公司会作为缓存层&#xff0c;存储唯一会话id&#xff0c;以及请求削峰作用 一、数据结构 Redis支持多种数据结构&a…

【AI时代,生命修行】

今日分享&#x1f4d2;&#xff0c;AI时代&#xff0c; 生命 与 修行&#xff1a; 不要用太多时间去工作&#xff0c;尤其是在人工智能时代。如果谁还在用传统的线性的费时间的这种努力的工作方式&#xff0c;只能说太落伍了。 我只说给同频的朋友们无关的人请划走。因为很多…

JVM类加载机制详解(JDK源码级别)

提示&#xff1a;从JDK源码级别彻底剖析JVM类加载机制、双亲委派机制、全盘负责委托机制、打破双亲委派机制的程序、Tomcat打破双亲委派机制、tomcat自定义类加载器详解、tomcat的几个主要类加载器、手写tomcat类加载器 文章目录 前言一、loadClass的类加载大概有如下步骤二、j…

Hadoop3:MapReduce源码解读之Map阶段的FileInputFormat的切片原理(2)

Job那块的断点代码截图省略&#xff0c;直接进入切片逻辑 参考&#xff1a;Hadoop3&#xff1a;MapReduce源码解读之Map阶段的Job任务提交流程&#xff08;1&#xff09; 4、FileInputFormat切片源码解析 切片入口 获取切片 获取切片最大的Size和切片最小的Size 判断文件是…

LeMeViT:具有可学习元令牌的高效ViT

本文提出使用可学习的元令牌来制定稀疏令牌&#xff0c;这有效地学习了关键信息&#xff0c;同时提高了推理速度。从技术上讲&#xff0c;主题标记首先通过交叉关注从图像标记中初始化。提出了双交叉注意&#xff08;DCA&#xff09;来促进图像令牌和元令牌之间的信息交换&…

SpringBoot2+Vue3开发课程审核流程系统

SpringBoot2Vue3开发课程审核流程系统 简介 此系统实现了课程审核全流程功能并使用了Activiti7工作流技术&#xff0c;功能包含&#xff1a;课程管理、用户管理、流程定义、课程审核&#xff08;我的申请、我的代办、我的已办&#xff09; 功能介绍 课程管理 对课程信息的管…

git凭证

默认是manager # 将凭证缓存到内存中&#xff0c;默认缓存15分钟 git config --global credential.helper cache# 将凭证存储到磁盘上的纯文本文件中 git config --global credential.helper store# 使用 Git 凭证管理器 git config --global credential.helper manager-core查…

【线性代数】向量空间,子空间

向量空间 设V为n维向量的集合&#xff0c;如果V非空&#xff0c;且集合V对于向量的加法以及数乘两种运算封闭&#xff0c;那么就称集合V为向量空间 x&#xff0c;y是n维列向量。 x 向量组等价说明可以互相线性表示 向量组等价则生成的向量空间是一样的 子空间 例题18是三位向…

【设计模式】行为型设计模式之 状态模式,带你探究有限状态机FSM的三种实现方式

什么是有限状态机 Finite state Machine FSM 简称状态机&#xff1a;状态机由三部分组成&#xff0c;状态(State) 事件(Event) 和动作(Action)组成。 其中事件也被称为转移条件&#xff0c;事件触发状态的转移和动作的执行。不过动作不是必须的&#xff0c;也可能只存在状态转…

全链路性能测试:Nginx 负载均衡的性能分析和调优

为什么性能测试很多同学觉得是一个比较难以自学上岸的测试领域,是因为真正做全链路的性能测试是比较难的。所谓的全链路就是在项目的整个链路上任何一环节都有可能存在性能测试瓶颈,我们都需要能够通过分析性能的监控指标找到对应的问题。 我们今天要讲的Nginx负载均衡就是…

C++中的一些困惑(长期更新中)

C中的一些困惑 文章目录 C中的一些困惑1. using std::具体命名与using namespace std;2. 【int \*p[10] 】与 【int (\*p)[10]】3. main()函数可带参&#xff0c;参从何来&#xff1f;4. constexpr函数的返回值可不为常量&#xff0c;那这时constexpr关键字作用是什么&#xff…

网页中生成ZIP文件,Zip 压缩、解压技术在 HTML5 浏览器中的应用

JSZip 是一款可以创建、读取、修改 .zip 文件的 javaScript 工具。在 web 应用中&#xff0c;免不了需要从 web 服务器中获取资源&#xff0c;如果可以将所有的资源都合并到一个 .zip 文件中&#xff0c;这时候只需要做一次请求&#xff0c;这样既减少了服务器的压力&#xff0…