Stream流

2023-11-01

概念:
  • 是JDK1.8的新语法 和IO流不是一个东西相当于流水线,很方便的对数据进行加工
  • Stream流把真正的函数式编程风格引入到Java中,代码简洁
  • Stream流不能直接修改数据源中的数据
  • 不使用Stream流的优势是加工处理数据,每个需求都要循环一次,还要搞一个新集合来装数据, 麻烦
Stream流思想:

获取Stream流

创建一条流水线,并把数据放到流水线上准备进行操作

中间方法

流水线上的操作一次操作完毕之后,还可以继续进行其他操作

终结方法

一个Stream流只能有一个终结方法是流水线上的最后一个操作

Stream流的获取方法:

Collection体系集合

集合对象.stream();

Map体系集合

间接的生成流,通过keySet或者entrySet获取一个Set集合,再获取Stream流
集合对象.keySet.stream();
集合对象.entrySet.stream();

数组

通过Arrays中的静态方法stream生成流
Arrays.stream(数组名);

同种数据类型的多个数据

一个类型多个数据,没有放在集合和数组中,单独存在的
比如:int num = 1,2,3,4,5;
String num2 = “a”,“b”,“c”,“d”,“e”;
stream.of(数据1,数据2,数据3.....)

forEach :

forEach:用于迭代集合或流,可以对集合或流的元素进行特定操作的实用方法。

代码演示:

public class Demo02 {
    public static void main(String[] args) {
        //Collection体系的集合可以使用默认方法stream()生成流
        List<String> list = new ArrayList<String>();
        list.add("韩信");
        list.forEach(s -> System.out.println(s));

        //Map体系的集合间接的生成流,不能直接获取Stream
        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("露娜", 22);
        map.put("宫本", 32);
        // 先获取所有的键,再把键放到Stream里
        map.keySet().forEach(s -> System.out.println(s));
        // 先获取键值对,再把键值对放在Stream里
        map.entrySet().stream().forEach(s -> System.out.println(s));

        //数组可以通过Arrays中的静态方法stream生成流
        String[] strArray = {"hello", "world", "java"};
        Arrays.stream(strArray).forEach(s -> System.out.println(s));

        //同种数据类型的多个数据可以通过Stream接口的静态方法of(T... values)生成流
        Stream.of("hello", "world", "java").forEach(s -> System.out.println(s));
        Stream.of(10, 20, 30).forEach(s -> System.out.println(s));
    }
}
Stream流的中间方法:
方法名 说明
Stream filter(Predicate predicate) 用于对流中的数据进行过滤
Stream limit(long maxSize) 返回此流中的元素组成的流,截取前指定参数个数的数据 ,保留前面的
Stream skip(long n) 跳过指定参数个数的数据,返回由该流的剩余元素组成的流 ,跳过前面的
static Stream concat(Stream a, Stream b) 合并a和b两个流为一个流
Stream distinct() 去除流中重复的元素,依赖hashCode和equals方法

代码演示:

public class Demo03 {
    public static void main(String[] args) {
        // Stream filter(Predicate predicate)	用于对流中的数据进行过滤
        List<String> list = new ArrayList<String>();
        list.add("韩信");
        list.add("李白");
        list.add("猴子");
        list.add("露娜");
        list.add("宫本");
        List<String> list2 = new ArrayList<String>();
        list2.add("韩信2");
        list2.add("李白2");
        list2.add("猴子2");
        list2.add("猴子2");
        list2.add("露娜2");
        list2.add("露娜2");
        list2.add("宫本2");
        // startsWith:方法用于检测字符串是否以指定的前缀开始。
        // endswith:方法用于判断字符串是否以指定后缀结尾
        list2.stream().filter(s -> s.startsWith("韩")).forEach(System.out::println);

        // Stream limit(long maxSize)	截取前指定参数个数的数据
        list.stream().limit(2).forEach(System.out::println);

        // Stream skip(long n)	跳过前面的,保留后面的
        list.stream().skip(2).forEach(System.out::println);

        // static Stream concat(Stream a, Stream b)	合并a和b两个流为一个流
        Stream.concat(list.stream(), list2.stream()).forEach(System.out::println);

        // Stream distinct()	去除流中的重复元素,依赖于hashcode&equals
        list2.stream().distinct().forEach(System.out::println);
    }
}
获取Stream流的终结方法:
方法名 说明
void forEach(Consumer action) 对此流的每个元素执行操作
long count() 返回此流中的元素数

代码演示:

public class Demo04 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("韩信");
        // void forEach(Consumer action)	对此流的每个元素执行操作
        list.forEach(System.out::println);

        // long count()	返回此流中的元素数
        System.out.println(list.stream().count());
    }
}
Stream流的收集:
方法名 说明
R collect(Collector collector) 把结果收集到集合中

工具类Collectors提供了具体的收集方式

方法名 说明
public static Collector toList() 把元素收集到List集合中
public static Collector toSet() 把元素收集到Set集合中
public static Collector toMap(Function keyMapper,Function valueMapper) 把元素收集到Map集合中

代码演示:

public class Demo05 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        for (int i = 1; i <= 10; i++) {
            list.add(i);
        }

    /*    filter:负责过滤数据
          collect:负责收集数据
          toList():把元素收集到List集合中,底层会创建一个List集合,并把所有的数据添加到集合
          toSet():把元素收集到Set集合中,会去除重复
          valueMapper:把元素收集到Map集合中
    */
        List<Integer> tolist = list.stream().filter(num -> num % 2 == 0).collect(Collectors.toList());
        System.out.println("tolist = " + tolist);

        Set<Integer> toset = list.stream().filter(num -> num % 2 == 0).collect(Collectors.toSet());
        System.out.println("toset = " + toset);

        String[] strArray = {"林青霞,30", "张曼玉,35", "王祖贤,33", "柳岩,25"};
        //得到字符串中年龄数据大于28的流
        Stream<String> arrayStream = Stream.of(strArray).filter(s -> Integer.parseInt(s.split(",")[1]) > 28);

        //把使用Stream流操作完毕的数据收集到Map集合中并遍历,字符串中的姓名作键,年龄作值
        Map<String, Integer> map = arrayStream.collect(Collectors.toMap(s -> s.split(",")[0], s -> Integer.parseInt(s.split(",")[1])));

        Set<String> keySet = map.keySet();
        for (String key : keySet) {
            Integer value = map.get(key);
            System.out.println(key + "," + value);
        }
    }
}
  • 我们发现Stream中的方法返回值分成两种,一种返回值还是Stream,另外一种返回值不是Stream
  • 返回值类型还是Stream的方法,我们称为函数拼接方法
  • 返回值类型不是Stream的方法,我们称为终结方法

Stream注意事项(重要):

1.Stream只能操作一次
2.Stream方法返回的是新的流
3.Stream不调用终结方法,中间的操作不会执行

使用Stream流操作数据2个步骤

1.得到Stream流
2.调用相应的方法

public class Demo12StreamForEach {
public static void main(String[] args) {
Stream<String> stream = Stream.of("张无忌", "张三丰", "周芷若");
stream.forEach(System.out::println);
	}
}

count:统计个数

  • 该方法返回一个long值代表元素个数
public class Demo09StreamCount {
public static void main(String[] args) {
Stream<String> original = Stream.of("张无忌", "张三丰", "周芷若");
Stream<String> result = original.filter(s -> s.startsWith("张"));
System.out.println(result.count()); // 2
	}
}

filter:过滤

过滤,得到符合要求的数据

public class Demo07StreamFilter {
public static void main(String[] args) {
Stream<String> original = Stream.of("张无忌", "张三丰", "周芷若");
Stream<String> result = original.filter(s -> s.startsWith("张"));
	}
}

limit:取用前几个

  • 限制, 取前面n个数据
public class Demo10StreamLimit {
public static void main(String[] args) {
Stream<String> original = Stream.of("张无忌", "张三丰", "周芷若");
Stream<String> result = original.limit(2);
System.out.println(result.count()); // 2
	}
}

skip:跳过前几个

  • 跳过前面n条数据
public class Demo11StreamSkip {
public static void main(String[] args) {
Stream<String> original = Stream.of("张无忌", "张三丰", "周芷若");
Stream<String> result = original.skip(2);
System.out.println(result.count()); // 1
	}
}

map:映射

  • 映射,将一种类型的流转换成另一种类型的流
public class Demo08StreamMap {
public static void main(String[] args) {
Stream<String> original = Stream.of("10", "12", "18");
Stream<Integer> result = original.map(Integer::parseInt);
	}
}

concat:组合

  • 将两个流合并成一个流
public class Demo12StreamConcat {
public static void main(String[] args) {
Stream<String> streamA = Stream.of("张无忌");
Stream<String> streamB = Stream.of("张翠山");
Stream<String> result = Stream.concat(streamA, streamB);
	}
}

4.收集Stream结果

我们使用Stream可以对数据进行处理.处理后怎么办?

收集到集合中

  • 我们可以将流中的数据收集到集合或数组中
  • public static Collector<T, ?, List> toList() :转换为 List 集合。
  • public static Collector<T, ?, Set> toSet() :转换为 Set 集合。
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Demo15StreamCollect {
public static void main(String[] args) {
Stream<String> stream = Stream.of("10", "20", "30", "40", "50");
List<String> list = stream.collect(Collectors.toList());
Set<String> set = stream.collect(Collectors.toSet());
	}
}

收集到数组中

Object[] toArray();

import java.util.stream.Stream;
public class Demo16StreamArray {
public static void main(String[] args) {
Stream<String> stream = Stream.of("10", "20", "30", "40", "50");
Object[] objArray = stream.toArray();
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Stream流 的相关文章

  • IDEA查找关键字快捷键,很实用。

    本页面查找关键字快捷键 Ctrl F 查找当前页面关键字 1 第一个向上的箭头 表示关键字跳转到上一个 2 第二个向下的箭头 表示关键字跳转到上一个 其他的各位都可以尝试一下 主要就是当页面有较多关键字时 让你可以更加容易查看 查找所有 S
  • static静态代码块

    static静态代码块 public class Person 静态代码块 在类加载时候执行静态代码块 只会执行一次 static System out println Person static initializer 实例初始化块 每次
  • 【Java SE】基本数据类型

    大家好 我是保护小周 本期为大家带来的是 Java的基本数据类型 内容会与C语言的基本数据类型进行基本的比较 数据类型提示 整型提升 以及简单了解 String 类型 进一步感受Java 的安全性 C语言混不下去了 面向对象的编程太爽了 目
  • 【JavaSE系列】第八话 —— 继承和它的边角料们

    导航小助手 思维导图 一 引出继承 二 继承的概念 三 继承的语法 四 父类成员访问 4 1 子类中访问父类的成员变量 4 2 子类访问父类的成员方法 五 super 关键字 5 1 super 成员变量 5 2 super 成员方法 5
  • 数据结构有哪些

    概念 数据结构 数据用什么样的方式组合在一起 数据结构是计算机存储数据的方式 指相互之间存在一种或多种特定关系的数据元素集合 常见数据结构 数据存储的常用结构有 栈 队列 数组 链表和红黑树 栈 stack 又称堆栈 它是运算受限的线性表
  • Java 基础进阶篇(十八):正则表达式匹配规则和应用

    文章目录 一 正则表达式概述 二 正则表达式的匹配规则 三 正则表达式在方法中的应用 3 1 校验手机号 邮箱和座机电话号码 3 2 字符串的内容替换和分割 四 编程题目 4 1 表示数值的字符串 4 2 非严格递增连续数字序列 一 正则表
  • 【javaSE】 反射与反射的使用

    文章目录 反射的定义 反射的用途 反射基本信息 反射相关的类 Class类 反射机制的起源 Class类中的相关方法 反射示例 获得Class对象的三种方式 反射的使用 反射优点和缺点 反射重点总结 总结 反射的定义 Java的反射 ref
  • 判断考生成绩等级(switch case语句练习)

    判断考生成绩等级 1 考生成绩控制在 0 100 2 成绩 90 100 优 成绩 80 90 良 成绩 70 80 可 成绩 60 70 一般 成绩 0 60 不及格 要求使用switch语句 不能使用if语句 class SwitchT
  • Java--Map和HashMap基础

    一 Map常用方法 1 Map集合在 java util Map 包下 Map集合以键值对 key和value 的方式存储数据 key和value都是引用数据类型 都是存储对象的内存地址 2 Map接口中常用方法 V put K key V
  • Java-进制转换

    常用的进制转换 十进制转二进制 二进制转十进制 十进制转八进制 八进制转十进制 十进制转十六进制 十六进制转十进制 如果二 八 十六之间想转换可以通过十进制做中间者 import java util Scanner import java
  • 面向对象编程(概念)

    面向对象编程 概念 面向过程 面向对象 面向过程思想 1 步骤清晰简单 第一步做什么 第二步做什么 2 面对过程是和处理一些较为简单的题目 面向对象思想 1 物以类聚 分类的思维模式 思考问题首先会解决问题需要哪些分类 然后对这些分类进行单
  • 3.5安装ideay、快捷键

    注册账号 网址 https www jetbrains com 绑定激活码 网址 https www jetbrains com store redeem Alt Enter 快速补全 Ctrl shift O 清理导包 去除无用的包 Ct
  • Java文件的读写

    文件与流 在实际生活中 我们总要对文件进行操作 Java提供了流可以帮助我们读写文件 下面是常用的流类型结构图 在对文件的读写操作中 字节流可用于读写二进制文件 字符流用于读写文本文件 所谓二进制文件 指文件无字符编码格式 均由字节 Byt
  • java中的异常

    异常 什么是异常 运行时异常和编译时异常 编译时异常 运行时异常 异常处理及其语法 异常的产生及处理 try catch语句 finally语句 抛出异常 throws关键字 throw关键字 自定义异常类 什么是异常 java中的异常是指
  • Java关键字--------final关键字

    final关键字 final关键字表示最终的 不可修改的 final关键字可以用来修饰类 方法和属性 1 final关键字修饰属性 被final关键字修饰的属性的值和类型都不能再改变 就属于常量 只能做一次赋值 被final修饰的属性通常与
  • Java的异常(分类、处理原则、应用实例、注意事项)

    学习笔记 异常 异常 是在运行时期发生的不正常情况 在java中用类的形式对不正常情况进行了描述和封装对象 描述不正常的情况的类 就称为异常类 以前 通常将正常流程代码和问题处理代码相结合 现在将正常流程代码和问题处理代码分离 提高阅读性
  • 什么?到现在你还不知道什么是 访问修饰限定符吗?

    导航小助手 前言 一 public 访问修饰限定符 二 private 访问修饰限定符 三 default 访问修饰限定符 3 1 包的概念 3 2 导入包中的类 3 3 自定义包 3 4 包访问权限 3 5 常见的包 四 protecte
  • Java字符串分析器

    package StruingTokenizer import java util StringTokenizer public class StringTokenizer public static void main String ar
  • Java中对象比较的三种方式

    一 针对对象值是否相等的比较 和 equals 的区别 当我们提到比较值的时候 大多数人都会想到 因为在一般情况下 人们对于比较的概念中 数字比较的应用场景出现频率是最多的 首先我们创建一个类 之后新建这个类的对象来进行比较验证 class
  • String类详解

    目录 一 创建字符串的四种方式 1 直接赋值 2 通过构造方法创建对象 3 通过字符数组创建对象 4 通过String类的静态方法valueOf 任意数据类型 gt 转为字符串 二 字符串比较相等 equals方法 equalsIgnore

随机推荐

  • 在Java中尽量使用包装类Integer而不使用int

    1 在MySQL中没有给字段赋值默认为null 当你从数据库中查出来也是null 如果该字段在对应的Java代码中是int类型 null不能对应int类型 因为int代表的是基本数据类型 只能是基本的数字 2 实体类的属性你可以给它赋值也可
  • 三分钟教你学Git(二十一) - 复制连续多个提交

    有时候我们有一个分支A 里边包含了提交A1 gt A2 gt A3 gt A4 gt A5等 然后我们又有一个分支B 里边包含了提交A1 gt A2 gt B1 gt B2 gt B3 现在我们想把分支A中的A3 A4 A5版本复制到分支B
  • vue3项目实战+element-plus

    记录自己搭建前端项目的学习过程和开发过程 希望一起学习进步 采用Vue3 element plus axios vue router sass 目前刚开始是用到了这些 随着开发慢慢更新 npm是比较慢的 所以我用的是pnpm 安装指令 np
  • 播放raw下的音乐文件

    在开发的过程中 我们需要一些不需要用户改变的音乐或图像文件 这些文件存在安卓res raw文件夹中 下面就介绍如何播放res raw文件夹中的乐 1 在res目录下新建一个raw文件夹 2 界面上 xml文件中有一个按钮控件 当我们点击按钮
  • 迭代器模式c++实现

    参考书籍 Head First设计模式 需求场景 餐馆和咖啡馆的菜单分别是用数组和容器 vector 存储的 有一天餐馆和咖啡店合并了想要打印菜单 必须实现两个不同的遍历 数组用sizeof计算长度 用 取元素 容器用size取长度 用at
  • 第二阶段 归纳总结

    总结归纳 文章目录 总结归纳 计算机理论基础为 的童鞋 一二阶段是基础 三四阶段是应用 1 Linux操作系统使用 2 数据机构 3 IO网络编程 4 并发编程 5 正则表达式 6 Mysql数据库 7 git使用 8 项目综合 聊天室 f
  • 2023年十大无代码测试工具 每个测试人员都应该知道

    编码 跟很多技能一样 需要多年的实践才能熟练掌握 让测试人员编写一堆代码组成测试程序 修复程序中的错误 并在几周内完成大量工作很有难度 根据2019 2020年世界质量报告 在敏捷项目中应用自动化测试的最大的问题就是很多测试人员缺乏专业编程
  • 双因素方差分析 matlab,MATLAB的双因素有交互效应的方差分析

    二 MATLAB的双因素有交互效应的方差分析在两个因素的试验中 不但每一个因素单独对试验结果起作用 往往两个因素的不同水平组合还会产生一定的合作效应 在方差分析中称为交互效应 交互效应在对因素方差分析中 通常是当成一个新因素来处理 设因素A
  • Django学习

    创建项目 django admin startproject mysite 目录结构如下 查看帮助 终端页面输入以下命令 django admin help django admin help Type django admin help
  • 缺陷检测数据集

    缺陷检测数据集 东北大学钢材表面缺陷数据集 铁质缺陷 东北大学钢材表面缺陷数据集 简介 该数据集是东北大学宋克臣团队制作而成 是钢材表面缺陷数据集 共有1800张图片 包含六种类型共有六种缺陷 crazing inclusion patch
  • Vue中路由vue-router的使用

    基本使用 1 安装vue router 命令 npm i vue router 2 应用插件 import VueRouter from vue router Vue use VueRouter 3 编写router配置项 import V
  • python中判断 nan 的几种方式

    float NaN 判断 float NaN float NaN pandas中的 nan 判断 pd isnull df1 df1 是DataFrame对象 也可以是Series对象 pd isna 直接判断DataFrame某一列是否为
  • Springboot自定义ThreadPoolTaskExecutor线程池多线程并发执行异步方法

    1 背景 当前因为工作需求 要发送大量Http请求 经过实践遍历发送需要6小时才能发送完毕 如果单线程发送请求会导致主线程阻塞 就会存在以下问题 前端用户等待响应时间过长 无法进行下一步操作 不利于用户操作系统 响应时间过长超过Tomcat
  • 内存分页

    内存分页 p Description 内存分页 p param records 待分页的数据 param pageNum 当前页码 param pageSize 每页显示的条数 return 分页之后的数据 public static
  • Git——C站最详细的Git教程,一篇学会Git(window\linux通用)

    Git C站最详细的Git教程 一篇学会Git window linux通用 文章目录 Git C站最详细的Git教程 一篇学会Git window linux通用 Git简介 Git 作用 为什么要进行源代码管理 Git的诞生 Git管理
  • vue双向数据绑定指令v-model

    vue双向数据绑定指令v model v model 被称为双向数据绑定指令 就是Vue实例对数据进行修改 页面会立即感知 相反页面对数据进行修改 Vue内部也会立即感知 v model 是vue中唯一实现双向数据绑定的指令 v bind
  • mybatis增删改查的写法集合

    增删改查的写法集合 注意 xml文件尽量不要注释 Usermapping public interface UserMapping 查询 List
  • mysql建_mysql简单建表

    NULL 和 NOT NULL 修饰符 可以在每个字段后面都加上这NULL 或 NOT NULL 修饰符来指定该字段是否可以为空 NULL 还是说必须填上数据 NOT NULL MySQL默认情况下指定字段为NULL修饰符 如果一个字段指定
  • 《Kafka系列》Java测试远程连接Kafka,实现生产者和消费者,发现两者数据不通?

    Java测试远程连接Kafka 实现生产者和消费者 发现两者数据不通 错误显示 错误排除 1 在网上看到有这种方法 修改Kafka下的conf下的server properties文件 cd opt apps kafka conf serv
  • Stream流

    概念 是JDK1 8的新语法 和IO流不是一个东西相当于流水线 很方便的对数据进行加工 Stream流把真正的函数式编程风格引入到Java中 代码简洁 Stream流不能直接修改数据源中的数据 不使用Stream流的优势是加工处理数据 每个