当前位置: 首页 > news >正文

Stream API

Stream API

    • Stream API说明:
    • Stream的操作三个步骤
    • 创建Stream的四种方式
    • 中间操作
      • 筛选与切片
      • 映射
      • 排序
    • 终止操作
      • 匹配与查找
      • 规约
      • 收集

Stream API说明:

Stream是java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找,过滤和映射数据等操作
使用Stream Api 对集合数据进行操作,就类似于使用SQL执行的数据库查询,也可以使用Stream API 来执行并操作,Stream API提供了一种高效且易于使用的处理数据的方式 。

Stream 和Collection 集合的区别,Collection 是一种静态的内存数据结构,而Stream 是有关计算的。前者是主要面前内存,存储在内存中,后者主要是面向CPU,通过CPU实现计算的。

集合讲的是数据,Stream讲的是计算!

Stream的操作三个步骤

1.创建Stream
一个数据源 ,获取一个流

2.中间操作
一个中间操作链,对数据源的数据进行处理

3.终止操作
一旦执行种植操作,就执行中间操作连,并产生结果,之后不会再使用。

若不执行终止操作 则不会进行中间操作,也就不会对数据进行处理。

创建Stream的四种方式

方式一 :通过集合

        List<Object> list =new ArrayList<>();
        Stream<Object> stream = list.stream();//返回一个顺序流 (按集合中的顺序来)
        Stream<Object> stream1 = list.parallelStream();//返回一个并行流(向多个线程一样执行)

方式二:通过数组

   int [] arr = new int[]{1,2,3,4,5,6};
        IntStream stream2 = Arrays.stream(arr);  //返回的类型是根据传入的类型决定的

方式三 通过Stream的of()

      Stream<Integer> stream3 = Stream.of(1, 2, 3, 4, 5);

方式四:创建无限流(了解一下)

中间操作

筛选与切片

方法描述
filter(Predicate p)接收Lambda,从流中排除某些元素
distinct()筛选,通过流所生成元素的 hashCode() 和 equals()去除重复元素
limit(long maxSize)截断流,使其元素不超过给定数量
skip(long n)跳过元素,返回一个扔掉了前n个元素的流,若流中元素不足n个,则返回一个空流,与limit(n)互补

filter

        int [] arr = new int[]{1,2,3,4,5,6};
        IntStream stream2 = Arrays.stream(arr);
		stream2.filter(value -> value>2).forEach(System.out::println);

在这里插入图片描述
注意我这里用同一个stream2 是因为我把上面那个注释了 不然的话一个Strem 在终止操作后就不存在了 不能重复使用
limit

       IntStream stream2 = Arrays.stream(arr);
        stream2.limit(3).forEach(System.out::println);

skip: 跳过几个元素

     IntStream stream2 = Arrays.stream(arr);
        stream2.skip(3).forEach(System.out::println);

在这里插入图片描述

distinct

        int [] arr = new int[]{1,2,3,4,4,5,6};
        IntStream stream2 = Arrays.stream(arr);
        stream2.distinct().forEach(System.out::println);

在这里插入图片描述

映射

方法描述
map接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素
map ToDouble接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的DoubleStream
map ToInt接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的IntStream
map ToLong接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的LongStream
flatMap接收一个函数作为参数,讲流中的每个值都换成一个流,然后把所有流连接成一个流

map
自动遍历 放在str中

  String [] arr = new String[]{"a","b","c","d","e","f"};
        Stream<String> stream = Arrays.stream(arr);
        stream.map(str->str.toUpperCase()).forEach(System.out::println);

在这里插入图片描述
练习 : 获得员工姓名长度大于三的员工姓名
1.首先先映射员工姓名 在进行过滤

List<Employee> employee =new ArrayList<>();
employee.stream().map(e->e.getName()).filter(name->name.length()>3).foreach(System.out::println)

排序

方法描述
sorted()产生一个新流,其中按自然顺序排序
sorted(Com parator com)产生一个新流
     Stream<String> stream = Arrays.stream(arr);
     stream.sorted().forEach(System.out::println);

在这里插入图片描述
对象类型的想要进行排序 需要实现Comparable接口 或者定制排序

这里假设有个员工类集合 需要按照 年龄进行排序
employees.stream().sorted((e1,e2)->{
return Integer.compare(e1.getAge(),e2.getAge());
}).forEach(System.out::println)

终止操作

匹配与查找

方法描述
allMatch检查是否匹配所有元素
anyMatch检查是否至少匹配一个元素
noneMatch检查是否没有匹配所有元素
findFirst()返回第一个元素
findAny()返回当前流中的任意元素
count返回流中元素总个数
max()返回流中最大值
min()返回流中最小值
foreach()内部迭代

例子1 : 判断是否所有员工的年龄都大于18

boolean allMatch=employees.stream().allMatch(e->e.getAge()>18);

规约

方法描述
reduce(T iden,BinaryOperator b)可以将流中元素反复结合起来 得到一个值 T
reduce(BinaryOperator b)可以将可以将流中元素反复结合起来 得到一个值 Optional< T>

例子

计算 1- 10自然数的和

List<Integer> list = Arrays.alist(1,2,3,4,5,6,7,8,9,10);
Integer sum=list.stream().reduce(0,Integer::sum);

练习2: 计算公司所有员工工资总和

employees.stream().map(Employee:: getSalary).reduce(Double::sum)
employees.stream().map(Employee:: getSalary).reduce((d1,d2)->d1+d2)

收集

方法描述
collect(Collection c )将流转换为其他形式,接收一个Collector接口的实现,用于给Stream中元素做汇总的方法

Collector 接口中的方法实现决定了如何对流执行收集的操作 如收集到(List ,Set Map)

练习: 查找工资大于6000的员工 结果返回一个List

employee.stream().filter(e- > e.getSalary()>6000).collect(Collectors.toList())

相关文章:

  • Iceberg源码学习:flink读iceberg流程一
  • C++----IO流(参考C++ primer)
  • 利用内网穿透实现无固定IP调试支付回调
  • AI/DM相关conference ddl(更新中)
  • 大脑神经网络记忆原理图,记忆力机制的神经网络
  • MySQL安装与配置
  • tf.quantization
  • CleanMyMac X的免费版电脑系统瘦身工具
  • k8s 读书笔记 - 初始化容器 Init Conatiner
  • ES8(Java API Client)查询详解
  • 内置单片机的433无线模块高速连传典型运用
  • SpringBoot学习_day7
  • 【项目】小帽课堂(一)
  • [JavaScript]_[初级]_[不使用JQuery原生Ajax提交表单文件并监听进度]
  • 笔记整体梳理
  • php的引用
  • [译]Python中的类属性与实例属性的区别
  • Java反射-动态类加载和重新加载
  • Node项目之评分系统(二)- 数据库设计
  • PHP 小技巧
  • rc-form之最单纯情况
  • React-Native - 收藏集 - 掘金
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • SOFAMosn配置模型
  • Swoft 源码剖析 - 代码自动更新机制
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 基于 Babel 的 npm 包最小化设置
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 前端路由实现-history
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 新手搭建网站的主要流程
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​第20课 在Android Native开发中加入新的C++类
  • #ifdef 的技巧用法
  • (12)Linux 常见的三种进程状态
  • (70min)字节暑假实习二面(已挂)
  • (9)STL算法之逆转旋转
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (安卓)跳转应用市场APP详情页的方式
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (算法设计与分析)第一章算法概述-习题
  • (转)VC++中ondraw在什么时候调用的
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .htaccess 强制https 单独排除某个目录