【Java8新特性】四、强大的Stream api


这里写自定义目录标题

  • 一、了解Stream
  • 二、流(stream)到底是什么?
  • 三、Stream操作的三个步骤
  • 四、创建Stream的四种方式
  • 五、Stream 的中间操作
    • 1、筛选和切片
    • 2、map 映射
    • 3、排序
  • 六、Stream 的终止操作
    • 1、查找和匹配
    • 2、归约
    • 3、收集

一、了解Stream

Stream是Java8中处理集合的一个工具

二、流(stream)到底是什么?

流是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列

【注意】
①、Stream 自己不会存储元素
②、Stream不会改变源对象。相反,他们会返回一个持有结果的新Stream
③、Stream操作是延迟执行的。这意味着它们会等到需要结果的时候才执行

三、Stream操作的三个步骤

  1. 创建Stream
    一个数据源(如:集合,数组),获取一个流

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

3)终止操作
一个终止操作,执行中间操作链,并产生结果
在这里插入图片描述

四、创建Stream的四种方式

1、可以通过Collection系列集合提供的stream()或 parallelStram() 创建流

  List<String> list = new ArrayList<>();Stream<String> stream1 = list.stream();

2、通过Arrays中的静态方法stream()来获取数组流

  Employee[] emps = new Employee[10];Stream<Employee> stream2 = Arrays.stream(emps);

3、通过Stream中的静态方法 of() 创建流

 Stream<String> stream3 =  Stream.of("aa","bb","cc");

4、由函数创建流:创建无限流

Stream<Integer> stream4 = Stream.iterate(0, (x) -> x + 2);
stream4.limit(10).forEach(System.out::println);Stream<Double> s = Stream.generate(() -> Math.random());
s.limit(10).forEach(System.out::println);

五、Stream 的中间操作

【注意】多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何的
处理!,而是在终止操作时一次性处理,称为“惰性求值”

1、筛选和切片

  • filter - 接受Lambda,从流中排除某些元素
  • limit - 截断流,使其元素不超过给定数量
  • skip - 跳过元素,返回一个扔掉了前 n 个元素的流。若流中元素不足n,则返回一个空流。
  • distinct - 筛选,通过流所生成元素的hashCode()和equals()去除重复元素
public class TestStream2 {List<Employee> employees = Arrays.asList(new Employee("张三",18,3000),new Employee("李四",45,4000),new Employee("王五",37,3000),new Employee("赵六",18,6000),new Employee("田七",40,10000),new Employee("田七",40,10000));//filter//内部迭代:迭代操作由Stream API完成@Testpublic void test1(){//中间操作不会不会有任何结果Stream<Employee> sm = employees.stream().filter((e) -> e.getAge() > 25);//终止操作//sm.forEach((e) -> System.out.println(e));sm.forEach(System.out::println);}//limit@Testpublic void test2(){employees.stream().filter((e) -> e.getAge() > 25).limit(2).forEach(System.out::println);}//skip@Testpublic void test3(){employees.stream().filter((e) -> e.getAge() > 25).skip(2).forEach(System.out::println);}//distinct() 【注意】比较的元素需要equals()方法@Testpublic void test4(){employees.stream().filter((e) -> e.getAge() > 25).skip(2).distinct().forEach(System.out::println);}
}

2、map 映射

  • map:接收一个函数作为参数,该函数会被用到每个元素上,并将其映射成一个新的元素
  • flatMap: 接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流
@Testpublic void test5(){List<String> list = Arrays.asList("aaa","bb","ccc");list.stream().map((str) -> str.toUpperCase()).forEach(System.out::println);System.out.println("-----------------------------------");employees.stream().map(Employee::getName).forEach(System.out::println);System.out.println("------------------------------------");Stream<Stream<Character>> sm = list.stream().map(TestStream2::filterCharacter);sm.forEach((stm) -> stm.forEach(System.out::println));System.out.println("------------------------------------");System.out.println("上述代码优化");list.stream().flatMap(TestStream2::filterCharacter).forEach(System.out::println);}//方法:将字符串转换成一个流
public static Stream<Character> filterCharacter(String str){List<Character> list = new ArrayList<>();for(Character c: str.toCharArray()){list.add(c);}return list.stream();
}

3、排序

  • sorted() : 自然排序
  • sorted(Comparator com) : 定制排序
 @Testpublic void test6(){List<String> list = Arrays.asList("aaa","bb","ccc");list.stream().sorted().forEach(System.out::println);System.out.println("------------------------------------");list.stream().sorted((x,y) -> -x.compareTo(y)).forEach(System.out::println);}

六、Stream 的终止操作

1、查找和匹配

allMatch - 检查是否匹配所有元素
anyMatch - 检查是否至少匹配一个元素
noneMatch - 检查是否没有匹配所有元素
findFirst - 返回第一个元素
FindAny - 返回当前流中的任意元素
count - 返回当前流中元素的总个数
max - 返回流中的最大值
min - 返回流中的最小值

public class TestStream3 {List<Employee> employees = Arrays.asList(new Employee("张三",18,3000, Employee.Status.Free),new Employee("李四",45,4000, Employee.Status.Free),new Employee("王五",37,3000, Employee.Status.Busy),new Employee("赵六",18,6000, Employee.Status.Vocation),new Employee("田七",40,10000, Employee.Status.Vocation));/*查找与匹配allMatch - 检查是否匹配所有元素anyMatch - 检查是否至少匹配一个元素noneMatch - 检查是否没有匹配所有元素findFirst - 返回第一个元素FindAny - 返回当前流中的任意元素count - 返回当前流中元素的总个数max - 返回流中的最大值min - 返回流中的最小值*/@Testpublic void test(){//allMatchboolean b = employees.stream().allMatch((e) -> e.getStatus().equals(Employee.Status.Busy));System.out.println(b);//anyMatchSystem.out.println(employees.stream().anyMatch((e) -> e.getStatus().equals(Employee.Status.Busy)));//findFirst//Optional: 容器类Optional<Employee> op = employees.stream().sorted((x, y) -> -Double.compare(x.getSalary(), y.getSalary())).findFirst();op.orElse(new Employee());  // orElse: 如果为空,则用什么来代替Employee e = op.get();System.out.println(e);}@Testpublic void test1(){long count = employees.stream().count();System.out.println(count);Optional<Employee> max = employees.stream().max((x, y) -> -Double.compare(x.getSalary(), y.getSalary()));System.out.println(max.get());//最少的工资是多少Optional<Double> min = employees.stream().map(Employee::getSalary).min(Double::compare);System.out.println(min.get());}
}

2、归约

reduce(T identity,BinaryOperater) / reduce(BinaryOperater): 可以将流中元素反复结合起来,得到一个值。返回 T

public void test(){List<Integer> list = Arrays.asList(1,2,3,4,5);//0称之为起始元素,将0作为x,在流中取出一个元素作为y,//然后将相加的结果作为x,再从流中取出一个元素作为y相加...//一直到流中的元素全部加完Integer sum = list.stream().reduce(0, (x, y) -> x + y);System.out.println(sum);System.out.println("------------------------------");//获取当前公司中,工资的总和Double sumSalary = employees.stream().map(Employee::getSalary).reduce(0d, (x, y) -> x + y);System.out.println(sumSalary);}

3、收集

collect(Collector c)
collect - 将流转换成其他形式,接受一个Collector接口的实现,
用于给stream中元素做汇总的方
Collector 接口中方法的实现决定了如何对流执行收集操作(如收集到List,Set,Map)
但是Collectors实用类提供了很多静态方法,可以方便地创建常用收集器实例,具体方法和实例如下demo:

/*** @author houChen* @date 2021/1/1 9:32* @Description:*** 收集* collect - 将流转换成其他形式,接受一个Collector接口的实现,* 用于给stream中元素做汇总的方法*/
public class TestStream4 {List<Employee> employees = Arrays.asList(new Employee("张三",18,3000, Employee.Status.Free),new Employee("李四",45,4000, Employee.Status.Free),new Employee("王五",37,3000, Employee.Status.Busy),new Employee("赵六",18,6000, Employee.Status.Vocation),new Employee("田七",40,10000, Employee.Status.Vocation));@Testpublic void test2(){List<String> names = employees.stream().map(Employee::getName).collect(Collectors.toList());for (String name: names) {System.out.println(name);}System.out.println("-------------------------------------------");//将结果收集到特殊的集合中HashSet<String> set = employees.stream().map(Employee::getName).collect(Collectors.toCollection(HashSet::new));set.forEach(System.out::println);}@Testpublic void test3(){//总数Long count = employees.stream().collect(Collectors.counting());System.out.println(count);System.out.println("---------------------------------");//求平均年龄Double avgAge = employees.stream().collect(Collectors.averagingDouble(Employee::getAge));System.out.println(avgAge);System.out.println("---------------------------------");//总和Double sumSalary = employees.stream().collect(Collectors.summingDouble(Employee::getSalary));System.out.println(sumSalary);//最大值Optional<Employee> maxSalary = employees.stream().collect(Collectors.maxBy((x, y) -> Double.compare(x.getSalary(), y.getSalary())));System.out.println(maxSalary.get());}//分组@Testpublic void test4(){Map<Employee.Status, List<Employee>> map = employees.stream().collect(Collectors.groupingBy(Employee::getStatus));Set<Employee.Status> statuses = map.keySet();Iterator<Employee.Status> iterator = statuses.iterator();while (iterator.hasNext()){Employee.Status next = iterator.next();System.out.println(next+":"+map.get(next));}}//多级分组 : 先按照状态分组,再按照青年、老年分组@Testpublic void test5(){Map<Employee.Status, Map<String, List<Employee>>> maps = employees.stream().collect(Collectors.groupingBy(Employee::getStatus,Collectors.groupingBy((e) -> {if (((Employee) e).getAge() <= 35) {return "青年";} else {return "老年";}})));System.out.println(maps);}//分区://   满足条件的为一个区//   不满足条件的为一个区@Testpublic void test6(){Map<Boolean, List<Employee>> map = employees.stream().collect(Collectors.partitioningBy(e -> e.getSalary() > 8000));System.out.println(map);}//将员工所有的名字取出来,并用"," 分隔@Testpublic void test7(){String namestr = employees.stream().map(Employee::getName).collect(Collectors.joining(","));System.out.println(namestr);}
}

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

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

相关文章

spring容器

spring容器 实现方式 spring中提供了各式各样的IOC容器的实现供用户选择和使用&#xff0c;使用什么样的容器取决于用户的需要 BeanFactory 该接口是最简单的容器&#xff0c;提供了基本的DI支持。最常用的BeanFactory实现是XmlBeanFactory类&#xff0c;根据XML文件中的定义加…

idea常用配置

IDEA设置全局配置 参考&#xff1a;IDEA设置全局配置_idea如何打开一个项目,全局设置-CSDN博客 idea提交代码到git或svn上时&#xff0c;怎么忽略.class、.iml文件和文件夹等不必要的文件 参考&#xff1a;idea提交代码到git或svn上时&#xff0c;怎么忽略.class、.iml文件和文…

Python爬虫网络实践:去哪儿旅游数据爬取指南

Python爬虫网络实践&#xff1a;去哪儿旅游数据爬取指南 在这个博客中&#xff0c;我们将探索如何使用 Python 来进行网络数据抓取&#xff0c;并以抓取旅游数据为例进行演示。我们将通过一个简单的示例来说明如何利用 Python 中的常用库进行网页抓取&#xff0c;从而获取旅游…

软件详细设计说明书(套用案例)

2系统总体设计 2.1整体架构 2.2整体功能架构 2.3整体技术架构 2.4设计目标 2.5.1总体原则 2.5.2实用性和先进性 2.5.3标准化、开放性、兼容性 2.5.4高可靠性、稳定性 2.5.5易用性 2.5.6灵活性和可扩展性 2.5.7经济性和投资保护 3系统功能模块详细设计 3.1个人办公…

一键下载 M3U8 并转换为 MP4升级版

之前的下载 M3U8程序&#xff0c;有很多问题&#xff0c; 为此做了一些升级&#xff0c;分享给大家。 增加了存在播放列表的情况处理播放列表路径和ts路径错误问题多线程问题对于电视剧多文件下载的处理 这里从网上找了一部的链接&#xff0c;可以参考这个网站https://www.zu…

3 突破编程_前端_SVG(rect 矩形)

1 rect 元素的基本属性和用法 在SVG中&#xff0c;<rect> 元素用于创建矩形。 <rect> 元素有一些基本的属性&#xff0c;可以用来定义矩形的形状、位置、颜色等。以下是这些属性的详细解释&#xff1a; x 和 y &#xff1a;这两个属性定义矩形左上角的位置。 x …

Llama 3下月正式发布,继续开源!

4月10日&#xff0c;Techcrunch消息&#xff0c;Meta在本周伦敦举办的一场活动中确定&#xff0c;下个月将正式发布Llama 3并且继续开源。 Meta全球事务总裁Nick Clegg表示&#xff0c;我们希望在下个月&#xff0c;甚至更短的时间内&#xff0c;正式推出新一代基础模型Llama …

全光谱台灯哪个牌子好,2024全光谱护眼台灯推荐

近年来&#xff0c;全光谱台灯悄然跻身于家庭必备品之列&#xff0c;赢得了众多消费者的好评。它们以减轻眼睛疲劳的功效而受到推崇&#xff0c;尽管也有声音质疑其实际效用&#xff0c;认为所谓的益处不过是一种心理安慰。面对这些相互矛盾的观点&#xff0c;许多消费者感到困…

Java数据结构二叉树

概念 一棵二叉树是结点的一个有限集合&#xff0c;该集合&#xff1a; 1. 或者为空 2. 或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。 从上图可以看出&#xff1a; 1. 二叉树不存在度大于2的结点 2. 二叉树的子树有左右之分&#xff0c;次序不能颠倒&#x…

【QingHub】EMQX单节点一键部署

EMQX 简介 EMQX是全球最具扩展性的开源MQTT 代理&#xff0c;具有高性能&#xff0c;可在 1 个集群中连接 1 亿多个 IoT 设备&#xff0c;同时保持每秒 100 万条消息的吞吐量和亚毫秒级的延迟。 EMQX 支持MQTT、HTTP、QUIC、WebSocket等多种开放标准协议。它 100% 符合MQTT 5.…

【氧化镓】β-Ga2O3肖特基势垒二极管的缺陷识别

本文是一篇关于β-Ga2O3肖特基势垒二极管在电子辐射和退火调节下缺陷识别的研究。文章首先介绍了β-Ga2O3作为一种高性能器件材料的重要性&#xff0c;然后详细描述了实验方法&#xff0c;包括样品制备、电子辐照、热退火处理以及电学特性和深能级瞬态谱&#xff08;DLTS&#…

Java快速入门系列-7(测试与调试)

第七章:测试与调试 第7章:测试与调试7.1 单元测试(JUnit)7.1.1 为什么要进行单元测试7.1.2 JUnit基础7.1.3 断言7.1.4 测试套件7.2 集成测试与系统测试7.2.1 集成测试7.2.2 系统测试7.3 调试技巧与工具7.3.1 断点7.3.2 单步执行7.3.3 变量检查7.3.4 条件断点7.3.5 日志记录…

集群服务器使用

查看剩余资源&#xff1a;sinfo -O Nodehost,Gres:.30,GresUsed:.45 第二列是总资源 第三列是占用量 申请资源&#xff1a;salloc -N 1 -n 1 -p normal --gresgpu:NVIDIAGeForceGTX1080Ti1 gres的名字来源于sinfo 查看任务情况 squeue JOBID NODES 连接资源 ssh NODES …

云原生__K8S

createrepo --update /var/localrepo/# 禁用 firewall 和 swap [rootmaster ~]# sed /swap/d -i /etc/fstab [rootmaster ~]# swapoff -a [rootmaster ~]# dnf remove -y firewalld-*[rootmaster ~]# vim /etc/hosts 192.168.1.30 harbor 192.168.1.50 master 192.168.1.…

注解(Annotation) --java学习笔记

注解 就是Java代码里的特殊标记&#xff0c;比如:Override、Test等&#xff0c;作用是:让其他程序根据注解信息来决定怎么执行该程序注意:注解可以用在类上、构造器上、方法上、成员变量上、参数上、等位置处 自定义注解 就是自己定义注解 自定义注解到底该怎么写&#xff1a…

linux离线安装redis

一、下载linux版本压缩包 地址&#xff1a;Download | Redis 为了安全稳定性&#xff0c;下载 6.2 版本&#xff0c;不下载最新版 二、上传到linux服务器 笔者上传到 /opt/redis下 &#xff0c;使用Xftp和Xshell工具&#xff0c;使用root权限 cd /opt sudo mkdir redis cd r…

Dude, where’s that IP? Circumventing measurement-based IP geolocation(2010年)

下载地址:https://www.usenix.org/legacy/event/sec10/tech/full_papers/Gill.pdf 被引次数:102 Gill P, Ganjali Y, Wong B. Dude, Wheres That {IP}? Circumventing Measurement-based {IP} Geolocation[C]//19th USENIX Security Symposium (USENIX Security 10). 2010.…

SQLite 4.9的虚拟表机制(十四)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite 4.9的 OS 接口或“VFS”&#xff08;十三&#xff09; 下一篇:SQLite数据库文件格式&#xff08;十五&#xff09; 1. 引言 虚拟表是向打开的 SQLite 数据库连接注册的对象。从SQL语句的角度来看&#xff0c; 虚拟表…

MySQL 主从 AUTO_INCREMENT 不一致问题分析

作者&#xff1a;vivo 互联网数据库团队 - Wei Haodong 本文介绍了 MySQL5.7 中常见的replace into 操作造成的主从auto_increment不一致现象&#xff0c;一旦触发了主从切换&#xff0c;业务的正常插入操作会触发主键冲突的报错提示。 一、问题描述 1.1 问题现象 在 MySQL …

网络——初识网络

在现如今&#xff0c;网络已经成了一种基础设施&#xff0c;大到国家&#xff0c;小到个人&#xff0c;网络已经充斥在我们每个人的身 边&#xff0c;如果一个人突然失去了网络&#xff0c;那么它的生活或多或少会出现一些不方便的地方&#xff0c;网络现在已 经伴随着我们的吃…