java基础之Java8新特性-Stream(流)

简介

流(Stream)是 Java 8 引入的一种处理集合数据的抽象概念,它提供了一种更简洁、更灵活的方式来操作和处理集合数据。流可以看作是一系列元素的管道,可以对这些元素进行筛选、转换、排序、归约等操作,实现各种数据处理需求。与传统的循环迭代方式相比,流的代码更易读、更易于并行化处理,并且能够充分发挥多核处理器的优势。通过使用流,可以提高代码的可读性和可维护性,同时也能够更高效地处理大规模数据集合。

Stream的常用案例

1.steam将list集合转set集合

public static void main(String [] args){List<Student> students=Arrays.asList(new Student("小明",18),new Student("小黑",16),new Student("小红",17));//转成流并进行set集合转换Set<Student> sets=students.stream().collect(Collectors.toSet());//集合遍历sets.forEach(stu->System.out.println(stu.toString()));}

在上面的示例中,我们首先创建了一个 List 集合 list,包含了三个对象。然后使用 stream 方法将其转换为流,接着使用 collect 方法将流中的元素收集到一个 Set 集合中,使用 Collectors.toSet() 指定要收集到的集合类型。最终得到了一个包含唯一元素的 Set 集合。

注意:转成set集合需要重写实体类Student的equals 方法和 hashCode 方法。

2.steam将list集合转map集合

public static void main(String [] args){List<Student> students=Arrays.asList(new Student("小明",18),new Student("小黑",16),new Student("小红",17));//转成StreamStream<Student> stream=students.stream();//转MapMap<String,Student> map=stream.collect(Collectors.toMap(student->student.getName(), student->student));//遍历map.forEach((key,value)->System.out.println(key+"--"+value));}

在上面的示例中,我们首先创建了一个包含学生对象的 List<Student> 集合 students。然后使用 stream 方法将其转换为流,接着使用 collect 方法将流中的元素收集到一个 Map 集合中,使用 Collectors.toMap() 指定键和值的提取方式。在这里,我们使用学生对象的姓名作为键,学生对象本身作为值。

3.steam计算求和

public static void main(String[] args) {List<Student> students= Arrays.asList(new Student("小明",18),new Student("小黑",16),new Student("小红",17));//创建流并累加年龄int sum=students.stream().mapToInt(Student::getAge).sum();System.out.println(sum);}

4.steam查找最值

  public static void main(String[] args) {List<Student> students= Arrays.asList(new Student("小明",18),new Student("小黑",16),new Student("小红",17));//找出年龄最大的人Optional<Student> max=students.stream().max((o1, o2)->o1.getAge()-o2.getAge());System.out.println(max);//找出年龄最小的人Optional<Student> min=students.stream().min((o1, o2)->o1.getAge()-o2.getAge());System.out.println(min);}

5.stream的match

match 方法用于判断流中的元素是否符合指定的条件,并返回一个布尔值。

match 方法有三个变种:

  1. allMatch 方法:判断流中的所有元素是否都符合指定的条件,如果都符合,返回 true,否则返回 false

  2. anyMatch 方法:判断流中是否存在任意一个元素符合指定的条件,如果有,返回 true,否则返回 false

  3. noneMatch 方法:判断流中是否不存在任何一个元素符合指定的条件,如果没有,返回 true,否则返回 false

 public static void main(String[] args) {List<Student> students= Arrays.asList(new Student("小明",18),new Student("小黑",16),new Student("小红",17));// 判断所有学生年龄是否都大于17boolean match = students.stream().allMatch(s -> s.getAge() > 17);System.out.println(match);//false//判断只要有一个学生年龄小于17boolean match1 = students.stream().anyMatch(s -> s.getAge() < 17);System.out.println(match1);//true//判断没有一个学生年龄大于18boolean match2 = students.stream().noneMatch(s -> s.getAge() > 18);System.out.println(match2);//true}

6.stream过滤器

filter 方法接受一个 Predicate 参数,该参数是一个函数式接口,用于指定过滤条件。filter 方法会根据条件筛选出流中符合条件的元素,并返回一个新的流。

 public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);// 过滤并打印出所有偶数Stream<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0);evenNumbers.forEach(System.out::println);}

7.stream Limit和skip

Stream 类提供了 limitskip 方法,用于限制流中元素的数量。

1.limit 方法:该方法用于截取流中的前 n 个元素,并返回一个新的流。如果流中的元素不足 n 个,则返回包含所有元素的流。

 public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 获取前3个元素Stream<Integer> limitedStream = numbers.stream().limit(3);limitedStream.forEach(System.out::println);}

2.skip 方法:该方法用于跳过流中的前 n 个元素,并返回一个新的流。如果流中的元素不足 n 个,则返回一个空的流。

 public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);//跳过前两个元素Stream<Integer> skipStream = numbers.stream().skip(2);skipStream.forEach(System.out::println);}

一般我们会通过limit方法和skip搭配进行分页截取

public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5,6,7,8,9,10);//一页五个截取第二页Stream<Integer> skipLimitStream = numbers.stream().skip(5).limit(5);skipLimitStream.forEach(System.out::println);}

8.stream实现排序

 public static void main(String[] args) {// 创建一个包含整数的StreamStream<Integer> stream1 = Stream.of(3, 1, 4, 1, 5, 9);Stream<Integer> stream2 = Stream.of(3, 1, 4, 1, 5, 9);// 使用sorted()方法对Stream1进行升序排序(默认)Stream<Integer> sortedStream = stream1.sorted();sortedStream.forEach(System.out::println);System.out.println("-----------------------------------------------");// 使用sorted()方法对Stream2进行降序排序Stream<Integer> sortedDescStream = stream2.sorted((a, b) -> b.compareTo(a));sortedDescStream.forEach(System.out::println);}

9.组合案例

我们来看一个需求

对给定的学生列表按照年龄降序排列并查找姓张的,获取前3位

public static void main(String[] args) {List<Student> students= Arrays.asList(new Student("张明",18),new Student("李黑",16),new Student("王红",17),new Student("张三",36),new Student("李四",27),new Student("刘备",56),new Student("关羽",47),new Student("张飞",49),new Student("张同",17),new Student("张良",41));//降序排序--查找姓张的--截取前三位students.stream().sorted((s1,s2)->s2.getAge()-s1.getAge()).filter(s->s.getName().startsWith("张")).limit(3).forEach(System.out::println);System.out.println("-----------------------------------------------");}

通过对流进行一系列的中间操作就可以完成这个需求,这种链式调用可以使代码非常简洁。

10.并行流

Stream 类提供了并行流的支持,可以通过 parallel 方法将一个顺序流转换为并行流。并行流可以充分利用多核处理器的优势,将流中的元素进行并发处理,从而提高处理效率。

前面所有流的示例都是顺序流(单线程),有时在面对较大的数据处理单线程效率太慢,我们就可以使用并行流(多线程)进行优化。

来看一个需求,求1-1亿的累加和,分别用单线程的顺序流跟多线程的并行流来看执行效率。

 public static void main(String[] args) {// 顺序流计算long start = System.currentTimeMillis();int sum = IntStream.rangeClosed(1, 1000000000).sum();long end = System.currentTimeMillis();System.out.println("顺序流计算结果:" + sum + ",耗时:" + (end - start) + " 毫秒");// 并行流计算start = System.currentTimeMillis();sum = IntStream.rangeClosed(1, 1000000000).parallel().sum();end = System.currentTimeMillis();System.out.println("并行流计算结果:" + sum + ",耗时:" + (end - start) + " 毫秒");}

可以看到执行效率还是有明显提升的。

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

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

相关文章

剑指offer题解合集——Week3day3

文章目录 剑指offerWeek3周三&#xff1a;树的子结构AC代码思路&#xff1a; 剑指offerWeek3 周三&#xff1a;树的子结构 题目链接&#xff1a;树的子结构 输入两棵二叉树 A&#xff0c;B&#xff0c;判断 B 是不是 A的子结构。我们规定空树不是任何树的子结构。数据范围 每…

【人工智能】深入了解人工智能的核心算法与应用实践

人工智能 学习AI要看的第一本书人工智能应当以人为本人工智能&#xff08;第3版&#xff09;通晓六点&#xff0c;明白人工智能是怎么回事基本概念和历史基础知识基于知识的系统高级专题现在和未来安全和编程 人工智能已经是基础学科 学习AI要看的第一本书 人工智能知识对于当…

Unix操作系统的前世今生

Unix是一种多用户、多任务操作系统&#xff0c;最初由AT&T贝尔实验室的肯汤普逊&#xff08;Ken Thompson&#xff09;和丹尼斯里奇&#xff08;Dennis Ritchie&#xff09;等人开发于上世纪70年代初。它被设计成一种通用的操作系统&#xff0c;支持跨多种硬件平台&#xf…

C++入门(详细解读,建议收藏)

&#x1f6a9;C是什么?&#x1f6a9;⛲&#x1f31f;⚡&#x1f966;&#x1f4ac; C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的程序&#xff0c;需要高度的抽象和建模时&#xff0c;C语言则不合适。为了解决软件危…

ssm基于Java Web的怀旧唱片售卖系统论文

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装怀旧唱片售卖系统软件来发挥其高效地信息处理的作用&#x…

计算机网络——网络中要解决的问题

1. 从网络管理的角度看 1.1 配置管理 追踪所有部署的硬件和软件资源&#xff0c;包括设备配置和软件版本。 1.2 故障管理​​​​​ 监控设备的运行状态&#xff0c;以确保所有组件都正常工作&#xff0c;以及快速响应和修复任何故障。 1.3 计费管理 监控资源消耗并进行计费…

使用FinalShell连接Linux系统

1.为什么要使用FinalShell连接Linux系统&#xff1f; 如果直接使用VMware上的Linux系统会有很多不方便&#xff1a; 内容的复制粘贴跨越VMware不方便文件的上传、下载跨越VMware不方便 也就是和Linux系统的各类交互&#xff0c;跨越VMware不方便 2.FinalShell下载 FinalSh…

【shell】bash script基础入门及例子(附代码)持续更新

A Bash script is a plain text file which contains a series of commands. Anything you can run normally on the command line can be put into a script ————https://ryanstutorials.net/bash-scripting-tutorial/bash-script.php Reference 教程&#xff1a;一篇教会…

RH850P1X芯片学习笔记-A/D Converter (ADCF)

文章目录 Features of RH850/P1x-C ADCFNumber of UnitsRegister Base AddressClock SupplyInterrupts and DMAHardware ResetExternal Input/Output SignalsVirtual Channel OverviewFunctional OverviewBlock DiagramPhysical Channels, Virtual Channels and Scan Groups Re…

年终总结——平凡又不平凡的2023

前言 总结不知道该如何写起&#xff0c;也不知该如何建立这一篇文章的大致框架&#xff0c;只知道我的2023大概也就分成两大块罢了。说起2023一整年&#xff0c;只能用平凡而又不平凡来形容&#xff0c;平凡在我依旧没有什么太突出的技术点&#xff0c;专业水平也一直处于龟速…

flutter项目初始化

flutter项目初始化 0、flutter 官方插件网址1、flutter项目环境配置2、flutter数据本地存储(shared_preferences)3、GetX 中的数据响应式配合本地存储使用4、Dio 封装使用详解5、EasyLoading的使用6、缓存 keep-alive使用(除了Tabbar,其它的页面、组件都可以使用)7、缓存 …

RFID传感器|识读器CNS-RFID-01/1S在AGV小车|搬运机器人领域的安装与配置方法

AGV 在运行时候需要根据预设地标点来执行指令&#xff0c;在需要 AGV 在路径线上位置执行某个指令时候&#xff0c;则需要在这个点设置 命令地标点&#xff0c;AGV 通过读取不同地标点编号信息&#xff0c;来执行规定的指令。读取地标点设备为寻址传感器&#xff0c;目前&#…

【C语言:可变参数列表】

文章目录 1.什么是可变参数列表2.可变参数列表的分析与使用2.1使用2.2分析原理2.3分析原码 1.什么是可变参数列表 对于一般的函数而言&#xff0c;参数列表都是固定的&#xff0c;而且各个参数之间用逗号进行分开。这种函数在调用的时候&#xff0c;必须严格按照参数列表中参数…

【Vue3+React18+TS4】1-1 : 课程介绍与学习指南

本书目录&#xff1a;点击进入 一、为什么做这样一门课程? 二、本门课的亮点有哪些? 2.1、轻松驾驭 2.2、体系系统 2.3、高效快捷 2.4、融合贯通 三、课程内容包括哪些? 四、项目实战 《在线考勤系统》 五、课适合哪些同学? 一、为什么做这样一门课程? 近十年内前端…

mysql常见问题

批量导入SQL 数据库结构 数据时&#xff0c;如果数据是批量插入的话会报错&#xff1a;2006 - MySQL server has gone away。 解决办法&#xff1a;找到你的 mysql 目录下的 my.ini 配置文件&#xff0c;加入以下代码 max_allowed_packet500M wait_timeout288000 interactiv…

git使用(完整流程)

1. 新建仓库 1.右击 git bash 后 输入 git init (仓库为:当前目录) git init name (仓库为:name文件夹) git clone https://github.com/Winnie996/calculate.git //https2.工作区域 工作目录 3. 添加 提交 git add . //工作区添加至暂存区 git commit -m "注释内容&q…

电脑常见蓝屏代码及含义

小编经过一年多的桌面终端运维经验和网络资料收集整理&#xff0c;现将相关代码及其含义分析出来&#xff0c;供大家参考&#xff0c;不足之处请批评指正&#xff01; 0X00000000 作业亮成 0X00000001 不正确的函数 0X00000002 系统找不到指定的档案 0X00000003 系统找不到…

Android14之Selinux解决neverallow报错(一百七十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Github数据库集群的升级部署思路

Github 花了一年多的时间&#xff0c;将他们的 1200 台 MySQL 集群从 v5.6 升级到了 v8.0&#xff0c;这里的难度非常之大&#xff0c;没做过大规模集群服务器运维的难以理解此中的难度、难以理解其中庞大的业务量&#xff0c;难以想象升级过程中的海量问题的解决等等。 Githu…

Kafka消息阻塞:拯救面试的八大终极解决方案!

大家好&#xff0c;我是小米&#xff0c;一个对技术充满热情的90后程序员。最近在准备社招面试的过程中&#xff0c;遇到了一个超级有挑战性的问题&#xff1a;“Kafka消息阻塞怎么解决&#xff1f;”今天&#xff0c;我就来和大家一起深入剖析这个问题&#xff0c;分享我在解决…