Java Stream流
Stream流
- Stream流的三类方法
- Stream流的获取方法
- Stream流的中间操作常用方法
- filter方法
- limit方法
- skip方法
- concat方法
- distinct方法
- Stream流的终结操作常用方法
- forEach方法
- count方法
- Stream流的收集方法
- Stream流案例练习
Stream流的三类方法
获取Stream流
创建一条流水线,并把数据放到流水线上准备操作
中间方法
流水线上的操作
可以执行多个操作
终结方法
流水线的最后一个操作
一个Stream流只能有一个终结方法
Stream流的获取方法
Stream流可以使用在 单列集合
、双列集合
、数组
和同种数据类型多个数据
这四种情况下
单列集合
ArrayList<String> list = new ArrayList<>(List.of("a", "b", "c")); list.stream().forEach(s -> System.out.println(s)); // 输出结果 // a // b // c
双列集合
HashMap<String, String> hm = new HashMap<>(); hm.put("20001", "zhangsan"); hm.put("20002", "lisi"); hm.put("20003", "wangwu"); // 先获取所有的键,然后通过stream流输出键 hm.keySet().stream().forEach(s -> System.out.println(s)); // 输出结果 // 20003 // 20002 // 20001
HashMap<String, String> hm = new HashMap<>(); hm.put("20001", "zhangsan"); hm.put("20002", "lisi"); hm.put("20003", "wangwu"); // 先获取所有的键值对对象,然后通过stream流输出所有对象 hm.entrySet().stream().forEach(s -> System.out.println(s)); // 输出结果 // 20003=wangwu // 20002=lisi // 20001=zhangsan
数组
int[] arr= {1, 2, 3, 4, 5}; Arrays.stream(arr).forEach(s -> System.out.println(s)); // 输出结果 // 1 // 2 // 3 // 4 // 5
同种数据类型多个数据
Stream.of(1, 2, 3, 4, 5).forEach(s -> System.out.println(s)); // 输出结果 // 1 // 2 // 3 // 4 // 5
Stream流的中间操作常用方法
filter方法
Stream<T> filter(Predicate predicate)
:用于对流中数据进行过滤
Predicate
接口中只有一个抽象方法 boolean test(T t)
参数 t
为流中的每一个数据,该方法返回一个布尔值,如果返回的结果为 true
则当前数据留下,如果返回的结果为 false
则过滤掉当前数据
实现案例
使用匿名函数作为参数
ArrayList<String> list = new ArrayList<>(List.of("赵四", "赵围", "张三", "李四")); list.stream().filter(new Predicate<String>() {@Overridepublic boolean test(String s) {Boolean result = s.startsWith("赵");return result;} }).forEach(s -> System.out.println(s));// 输出结果 // 赵四 // 赵围
使用lambda函数作为参数
因为Predicate接口中只有一个抽象方法 test,所以可以使用lambda表达式来达到简化代码的目的
ArrayList<String> list = new ArrayList<>(List.of("赵四", "赵围", "张三", "李四")); list.stream().filter((String s) -> {Boolean result = s.startsWith("赵");return result; }).forEach(s -> System.out.println(s));// 输出结果 // 赵四 // 赵围
简化lambda函数
ArrayList<String> list = new ArrayList<>(List.of("赵四", "赵围", "张三", "李四")); list.stream().filter(s -> s.startsWith("赵")).forEach(s -> System.out.println(s));
limit方法
Stream<T> limit(long maxSize)
:截取指定参数个数的数据
ArrayList<String> list = new ArrayList<>();
list.add("小明");
list.add("小鸿");
list.add("小红");
list.add("小华");
list.stream().limit(2).forEach(s -> System.out.println(s));// 输出结果
// 小明
// 小鸿
skip方法
Stream<T> skip(long n)
:跳过指定参数个数的数据
ArrayList<String> list = new ArrayList<>();
list.add("小明");
list.add("小鸿");
list.add("小红");
list.add("小华");
list.stream().skip(2).forEach(s -> System.out.println(s));// 输出结果
// 小红
// 小华
concat方法
static <T> Stream<T> concat(Stream a, Stream b)
:合并 a
和 b
两个流为一个流
ArrayList<String> list = new ArrayList<>();
list.add("小明");
list.add("小鸿");
list.add("小红");
list.add("小华");ArrayList<String> list2 = new ArrayList<>();
list2.add("小花");
list2.add("小爱");
list2.add("小密");
list2.add("小五");Stream.concat(list.stream(), list2.stream()).forEach(s -> System.out.println(s));// 输出结果
// 小明
// 小鸿
// 小红
// 小华
// 小花
// 小爱
// 小密
// 小五
distinct方法
Stream<T> distinct()
:去除流中重复的元素,依赖(hashCode()
和equals()
方法)
ArrayList<String> list = new ArrayList<>();
list.add("小明");
list.add("小鸿");
list.add("小红");
list.add("小华");
list.add("小华");
list.add("小华");
list.stream().distinct().forEach(s -> System.out.println(s));// 输出结果
小明
小鸿
小红
小华
Stream流的终结操作常用方法
forEach(Consumer action)
:对流的每个元素执行操作Consumer
接口中只有一个void accept(T t)
方法,该方法对给定的参数执行此操作
long count()
:返回流中的元素个数
forEach方法
匿名内部类传参
ArrayList<String> list = new ArrayList<>(List.of("1", "2", "3")); // 匿名内部类传参 list.stream().forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);} });// 输出结果 // 1 // 2 // 3
lambda
函数传参因为
Consumer
接口里只有一个抽象方法accept
,所以可以使用lambda
函数简化代替ArrayList<String> list = new ArrayList<>(List.of("1", "2", "3")); list.stream().forEach((String s) -> {System.out.println(s); });// 输出结果 // 1 // 2 // 3
简化lambda函数
ArrayList<String> list = new ArrayList<>(List.of("1", "2", "3")); list.stream().forEach(s -> System.out.println(s));// 输出结果 // 1 // 2 // 3
count方法
long count = list.stream().count();
System.out.println(count);// 输出结果
// 3
Stream流的收集方法
通过stream
流获取到的集合、数组等类型的数据进行修改操作,但是源数据是没有改变的,我们无法直接修改源数据,但是我们可以使用相关方法对流中的数据进行保存
Stream流的收集方法
R collect(Collector collector)
工具类Collectors提供的具体收集方式
public static <T> Collector toList()
:把元素收集到List
集合中ArrayList<Integer> list = new ArrayList<>(List.of(1, 2, 3, 4, 5, 6, 7, 7, 7)); List<Integer> collectList = list.stream().filter(number -> number % 2 == 1).collect(Collectors.toList()); System.out.println(collectList); // [1, 3, 5, 7, 7, 7]
public static <T> Collector toSet()
:把元素收集到Set
集合中ArrayList<Integer> list = new ArrayList<>(List.of(1, 2, 3, 4, 5, 6, 7, 7, 7)); Set<Integer> collectSet = list.stream().filter(number -> number % 2 == 1).collect(Collectors.toSet()); System.out.println(collectSet); // [1, 3, 5, 7]
public static <T> Collector toMap(Function keyMapper, Function valueMapper)
:把元素收集到Map
集合中创建一个
ArrayList
集合,集合添加这些元素 “zhangsan,24”、“lisi,18”、“wangwu,26”、“zhaoliu,20” ,这些元素前面是姓名,后面是年龄;现需将里面的元素筛选出来,条件是年龄大于等于24岁的,并把帅选出来的数据保存到Map
集合中,姓名为键,年龄为值。ArrayList<String> list = new ArrayList<>(); list.add("zhangsan,24"); list.add("lisi,18"); list.add("wangwu,26"); list.add("zhaoliu,20");Map<String, String> map = list.stream().filter(s -> {String[] split = s.split(",");int age = Integer.parseInt(split[1]);return age >= 24; }).collect(Collectors.toMap(s -> s.split(",")[0],s -> s.split(",")[1] )); System.out.println(map); // {zhangsan=24, wangwu=26}
toMap()
里的第一个lambda
表达式是如何获取Map
集合元素中的键,第二个lambda
表达式是如何获取Map
集合元素中的值
Stream流案例练习
现有两个 ArrayList
集合,分别存储5名男同学和5名女同学的名字,要求完成以下操作:
- 男同学只要名字为3个字的前三个人
- 女同学只要姓李的,并且跳过第一个人
- 将过滤后的男同学和女同学的姓名合并到一起
- 完成合并操作后得到的元素作为构造方法的参数创建学生对象,然后遍历数据
- 学生类
Student
,里面有一个成员变量,一个不带参数的构造方法,一个带参数构造方法,以及成员变量对应的get
和set
方法,还有toString()
方法
- 学生类
学生类
package com.cmy.streamdemo;/*** @author chenmingyong*/
public class Student {private String stuName;public Student(String stuName) {this.stuName = stuName;}public String getStuName() {return stuName;}public void setStuName(String stuName) {this.stuName = stuName;}@Overridepublic String toString() {return "Student{" +"stuName='" + stuName + '\'' +'}';}
}
测试类
package com.cmy.streamdemo;import java.util.ArrayList;
import java.util.stream.Stream;/*** @author chenmingyong*/
public class Practice {public static void main(String[] args) {// 创建存储男同学的姓名集合ArrayList<String> maleList = new ArrayList<>();maleList.add("轩辕浅");maleList.add("百里回");maleList.add("百殇");maleList.add("慕容凰");maleList.add("洋希");maleList.add("诸葛尘");// 创建存储女同学的姓名集合ArrayList<String> femaleList = new ArrayList<>();femaleList.add("李疏寒");femaleList.add("凌雪姣");femaleList.add("江舞寒");femaleList.add("李梦儿");femaleList.add("李楠楠");femaleList.add("李锦");// 筛选男同学,只要名字为3个字的前三个人Stream<String> maleStream = maleList.stream().filter(male -> male.length() == 3).limit(3);// 筛选女同学,只要姓李的,并且跳过第一个人Stream<String> femaleStream = femaleList.stream().filter(female -> female.startsWith("李")).skip(1);// 合并两个流并将得到的元素作为构造方法的参数创建学生对象,然后遍历数据Stream.concat(maleStream, femaleStream).forEach(s -> {Student student = new Student(s);System.out.println(student);});}
}
Java Stream流相关推荐
- java Stream 流
java Stream 流 Stream 流 流的创建 流的转化 Optianal 流的计算 Stream 流 1. Stream的定义 来自数据源的支持聚合操作的元素序列. 即一个流对外提供接口,接 ...
- 测试Java Stream流 parralle与 sequential的效率
测试Java Stream流 parralle与 sequential的效率 实验环境 操作系统:win10 处理器:Intel i5-4200U 2核4线程 Java版本:1.8 实验方案 统计大小 ...
- Java stream流式计算详解
Java stream流式计算详解 1. Stream概述 1.1 Stream简介 1.2 Stream分类 2. Stream操作 2.1 Stream创建 2.2 Stream无状态操作 2.3 ...
- Java Stream流基础
Java Stream流基础 何为Steam流? Stream 是对集合数组对象功能的增强,其专注于对集合数组对象进行各种非常便利.高效的聚合操作,或者大批量数据操作.通常我们需要多行代码才能完成的操 ...
- Java Stream流之求和
Java Stream流之求和 流方式实现 基本数据类型 和 包装类型 的一位数组求和 package top.yangbocsu;import java.util.Arrays;/*** @auth ...
- Java Stream流的概念
为什么80%的码农都做不了架构师?>>> 1. Java的流分为 Inputstream 和 OutputStream: 2. 流(stream)的概念源于UNIX中管道(pi ...
- Java Stream(流)的分类, 四大基本流的介绍
上一篇文章已经介绍过什么是流, 以及流的基本概念 http://blog.csdn.net/nvd11/article/details/29917065 本文主要介绍java四大基本流的方法. 一, ...
- Java Stream流总结
Java8新增的Stream,配合同版本出现的 Lambda ,给我们操作集合(Collection)提供了极大的便利. 文章目录 前言 一.stream是什么? 二.使用步骤 1.得到sream 2 ...
- Java -Stream流和常见函数式接口
概念 流(Stream)与集合类似,但集合中保存的是数据,而Stream中保存对集合或数组数据的操作. 特点 tream 自己不会存储元素. Stream 不会改变源对象.相反,他们会返回一个持有结果 ...
- 深度掌握 Java Stream 流操作,让你的代码高出一个逼格
概念 Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选.排序.聚合等. Stream` 的操作符大体上分为两种:`中间操作符`和`终止操 ...
最新文章
- Android RadioButton 修改选择框
- linux服务器root的密码修改
- android 多个属性值,android布局属性值fill_parent和match_parent
- C#反射调用 异常信息:Ambiguous match found.
- [转]密码技术-实现数字信封和数字签名
- android so abi适配,Android NDK学习(六): so文件兼容之abiFilters的使用
- 2018最新版硬盘装系统,不要U盘也能装
- Real Application Cluster 10g安装与配置(下)
- php正则 网址,php使用正则表达式获取字符串中的URL
- 码云怎么创建公开的仓库_使用码云创建属于你的免费私有git仓库
- 【机器人技术基础】MATLAB Robotics Toolbox PUMA560 运动学正逆解
- android 手机 基站定位软件,安卓手机基站+GPS定位源码
- CentOs7下Zabbix安装教程——zabbix agent安装和前端配置
- 计算机-flash遮罩层动画,flash遮罩层动画作业
- python flash游戏_基于Python的Flash游戏人工智能
- php怎么联网,家庭宽带上网连接方式
- 温湿度传感器—HDC1080
- DW_axi_dmac控制器(概述)
- 东软云HIS医疗管理系统——技术栈【SpringBoot+Vue+MySQL+MyBatis】
- 移动拼图游戏(八数码问题)A*版
热门文章
- 鬼谷八荒宗门亲密度怎么提升
- 内温的整体优先效应实验_认知
- 驰骋计算产业数十年的Wintel联盟开始分崩离析
- 程序员该如何提高睡眠质量?
- 怎么用计算机控制打印机扫描,打印机怎么设置扫描到电脑 打印机设置扫描的步骤方法...
- 使用python的turtle绘画滑稽脸
- instanceof和containsKey以及claims.getExpiration()以及expiration.before()的用法
- CodeForces 595A Vitaly and Night
- 加拿大 计算机学校排名2015,2015年加拿大大学综合排名
- AVC/HEVC/VVC/AV1 块划分、帧内预测过程及预测模式编码