(超级详细)JAVA之Stream流分析-------持续更新喔!!!

学习目标:

  • 掌握 Java Stream流的相关api
  • 掌握 Java Stream流的基本实现
  • 掌握 java Stream流的使用场景
  • 代码已经整理上传到了gitee中,有需要的小伙伴可以取查看一下源码点个小心心喔

大家也可以帮我提交一点案例喔!!!!!
大家一起交流学习!
https://gitee.com/Aoyuan-210902/JAVAStreamDemo.git


点个赞嘛!!!!!!!!!!!!!!!!!!!!!!!!!
在这里插入图片描述

JAVA Stream流

概述

Java Stream API 是 Java 8 中引入的一个功能强大的新库,它提供了一种高效且声明式的处理数据集合的方法。通过使用 Streams,开发者可以写出简洁且易于理解的代码,用于对数据执行复杂的查询和聚合操作。

什么是Stream流,Stream流的特点是什么?

  • 含义
    在 Java 中,Stream 是对集合(Collection)对象功能的一个补充,它支持顺序和并行的聚集操作。Streams 不存储数据,它们只在需要时从源(如集合或数组)中获取数据。

  • 主要特点
    声明式:相比于传统的迭代方式,stream 提供了一种声明式的方法来表达数据处理任务。
    可组合:stream 操作可以链接起来,形成一个大的流水线,这样可以表达复杂的数据处理策略(比如筛选,排序等)。
    并行能力:Streams 可以透明地并行处理,利用多核架构而无需编写特定的多线程代码。

常见操作

Stream 操作分为中间操作和终端操作两种:

中间操作:如 filter、map、sorted 等,它们返回一个新的 Stream,可以连接多个中间操作。
终端操作:如 forEach、collect、reduce 等,它们输出结果或者产生副作用(例如输出到屏幕),并且关闭 Stream。

一些Stream的特性

  • 函数式编程: 通过Stream流可以代替复繁琐难懂的for循环等代码,对数据进行操作。
  • Stream流不会直接得出结果,而是在调用终端操作的时候,才会运行中间操作。

Optional类

在Java中,Optional是一个容器类,它可以包含也可以不包含非空值。Optional类主要用于防止NullPointerException异常的发生,它提供了一种更优雅的方法来处理可能为null的对象。使用Optional可以显式地要求调用者处理空值情况。

Optional提供了多种方法来检查、获取和转换包含的值:

isPresent():检查Optional是否有值。
get():获取Optional的值,如果Optional为空,则抛出NoSuchElementException。
orElse():如果Optional有值则返回该值,否则返回传递给orElse的参数。
ifPresent():如果值存在,执行给定的操作。 map()和flatMap():对Optional的值应用函数。
Optional常用于新的Java API中,如Stream的终端操作,返回一个Optional类型的结果

Stream流的操作

distinct

package distinctStream;import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class DistincrtStrream {public static void main(String[] args) {//distint主要是去除掉集合中重复的代码List<Integer> list = Arrays.asList(1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6);List<Integer> collect = list.stream().distinct().collect(Collectors.toList());collect.forEach(System.out::println);}
}
运行实例

在这里插入图片描述

filter筛选操作

示例1

package filterStream;import java.util.ArrayList;
import java.util.List;public class FilterDemo01 {//找到集合中元素大于5的数public static void main(String[] args) {List<Integer> demo01 = new ArrayList<>();demo01.add(1);demo01.add(5);demo01.add(7);demo01.add(8);demo01.add(9);System.out.println("没有进行筛选之前的数据");demo01.forEach(System.out::println);System.out.println("筛选之后的数据");demo01.stream().filter(x -> x > 5).forEach(System.out::println);}
}

在这里插入图片描述
示例2

package filterStream;import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;public class FilterDemo02 {public String username;public String password;public FilterDemo02() {}public FilterDemo02(String username, String password) {this.username = username;this.password = password;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "FilterDemo02{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';}public static void main(String[] args) {FilterDemo02 user01 = new FilterDemo02("aoyuan","123");FilterDemo02 user02 = new FilterDemo02("yuan","234");FilterDemo02 user03 = new FilterDemo02("ao","345");List<FilterDemo02> list  = new ArrayList<>();list.add(user01);list.add(user02);list.add(user03);//查找username = aoyuan的List<FilterDemo02> collect = list.stream().filter(n -> n.getUsername().equals("aoyuan")).collect(Collectors.toList());collect.forEach(System.out::println);System.out.println("------------------------------------------------------------------------------");//查找username =aoList<FilterDemo02> collect01 = list.stream().filter(n -> n.getUsername().equals("ao")).collect(Collectors.toList());collect01.forEach(System.out::println);System.out.println("------------------------------------------------------------------------------");List<FilterDemo02> collect02 = list.stream().filter(n -> n.getPassword() != "123").collect(Collectors.toList());collect02.forEach(System.out::println);}
}
运行示例

在这里插入图片描述

limit截取操作

示例1

package limitStream;import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;public class LimitDemo01 {public static void main(String[] args) {//limit是截取第n个元素List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);Stream<Integer> limit1 = list.stream().limit(2);Stream<Integer> limit2 = list.stream().limit(6);System.out.println("----------------截取第2个---------------");limit1.forEach(System.out::println);System.out.println("-----------------截取6个---------------------");limit2.forEach(System.out::println);}
}
运行示例

在这里插入图片描述
示例2

package limitStream;import java.util.stream.Stream;public class LimitDemo02 {public static void main(String[] args) {//interage迭代器会一直进行下去,所以由inerate创建的流是无限流,需要limit方法截断Stream<Integer> demo03 = Stream.iterate(0, n -> n+2).limit(6);demo03.forEach(System.out::println);System.out.println("limit起到了什么作用呢?起到了截断的作用");Stream<Integer>  demo04 = Stream.iterate(0,n -> n+2).limit(7);demo04.forEach(System.out::println);System.out.println("generate方法");//generate方法Stream<Double> generateStream = Stream.generate(Math::random).limit(5);generateStream.forEach(System.out::println);}
}
运行示例

在这里插入图片描述

map映射操作

User类

package mapStream;public class User {private String username;private Integer id;private String address;public User() {}public User(String username, Integer id, String address) {this.username = username;this.id = id;this.address = address;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", id=" + id +", address='" + address + '\'' +'}';}
}

userdao类

package mapStream;public class UserDao {private String username;private String address;public UserDao() {}public UserDao(String username, String address) {this.username = username;this.address = address;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "UserDao{" +"username='" + username + '\'' +", address='" + address + '\'' +'}';}
}

示例1

package mapStream;import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;public class FilterDemo01 {public static void main(String[] args) {List<User>  userList= new ArrayList<>();userList.add(new User("aoyuan",1,"baotou"));userList.add(new User("aoyuan01",2,"bao"));userList.add(new User("aoyuan02",3,"tou"));//拿到用户集合中的数据并将用户名转化为大写List<String> collect = userList.stream().map(x -> x.getUsername().toUpperCase()).collect(Collectors.toList());collect.forEach(System.out::println);//拿到user集合选择数据存储在新的userDao集合中List<UserDao> collect1 = userList.stream().map(x -> {UserDao userDao = new UserDao();userDao.setUsername(x.getUsername());userDao.setAddress(x.getAddress());return userDao;}).collect(Collectors.toList());collect1.forEach(System.out::println);}
}
运行示例

在这里插入图片描述
示例2

package mapStream;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class FilterDmeo02 {public static void main(String[] args) {List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);List<Integer> collect = list.stream().map(x -> x + 3).collect(Collectors.toList());collect.forEach(System.out::println);}}
运行示例

在这里插入图片描述

取max和min的相关操作

示例1

package maxStream;import java.util.Arrays;
import java.util.List;
import java.util.Optional;public class Demo {public static void main(String[] args) {//自定义排序List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);//从大到小排序Optional<Integer> max = list.stream().max((o1, o2) -> o1 - o2);System.out.println("最大值为+"+ max.get());}
}

运行示例

在这里插入图片描述

示例2

package maxStream;import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;public class Demo01 {public static void main(String[] args) {List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);Optional<Integer> max = list.stream().max(Integer::compareTo);System.out.println("最大值为+:"+ max);}
}

运行示例

在这里插入图片描述

示例3

package maxStream;import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;public class Demo02 {public static void main(String[] args) {List<String> strings = Arrays.asList("aoyuan", "aoyuanao", "aoyuanaoyuan");Optional<String> max = strings.stream().max(Comparator.comparing(String::length));System.out.println("最长的字符串为" + max);}}

运行示例

在这里插入图片描述
示例3

package minStream;import java.util.Arrays;
import java.util.List;
import java.util.Optional;public class StreamMinExample01 {static class Person {String name;int age;Person(String name, int age) {this.name = name;this.age = age;}int getAge() {return age;}@Overridepublic String toString() {return name + ": " + age;}}public static void main(String[] args) {List<Person> people = Arrays.asList(new Person("Alice", 22),new Person("Bob", 20),new Person("Charlie", 30),new Person("David", 25));Optional<Person> youngest = people.stream().min((p1, p2) -> Integer.compare(p1.getAge(), p2.getAge()));youngest.ifPresent(person -> System.out.println("The youngest person is " + person));}
}

运行示例

在这里插入图片描述

示例4

package minStream;import java.util.Arrays;
import java.util.List;
import java.util.Optional;public class StreamMinExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, -1, 6, 7);// Using Stream.min() to find the minimum value in the listOptional<Integer> minNumber = numbers.stream().min(Integer::compare);// Checking and displaying the minimum numberif (minNumber.isPresent()) {System.out.println("The minimum number is " + minNumber.get());} else {System.out.println("List is empty.");}}
}

运行示例

在这里插入图片描述

reduce归约

package reduce;import java.util.ArrayList;
import java.util.List;
import java.util.Optional;public class ReduceStreamDemo {public static void main(String[] args) {List<Integer> demo = new ArrayList<>();demo.add(2);demo.add(4);demo.add(1);demo.add(5);
//x+y的和Optional<Integer> reduce = demo.stream().reduce((x, y) -> x + y);System.out.println(reduce.get());//求最大值Optional<Integer> reduce1 = demo.stream().reduce((x, y) -> x > y ? x : y);System.out.println(reduce1.get());}
}
运行示例

在这里插入图片描述

排序

示例1

package sortStream;import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class StreamSortExample {static class Person {String name;int age;Person(String name, int age) {this.name = name;this.age = age;}String getName() {return name;}@Overridepublic String toString() {return name + ": " + age;}}public static void main(String[] args) {List<Person> people = Arrays.asList(new Person("Alice", 22),new Person("Charlie", 30),new Person("David", 25),new Person("Bob", 20));List<Person> sortedPeople = people.stream().sorted((p1, p2) -> p1.getName().compareTo(p2.getName())).collect(Collectors.toList());sortedPeople.forEach(System.out::println);}
}
运行示例

在这里插入图片描述

示例2

package sortStream;import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class StreamSortExample02 {static class Person {String name;int age;Person(String name, int age) {this.name = name;this.age = age;}int getAge() {return age;}public String getName() {return name;}@Overridepublic String toString() {return name + ": " + age;}}public static void main(String[] args) {List<Person> people = Arrays.asList(new Person("Alice", 22),new Person("Charlie", 30),new Person("David", 25),new Person("Bob", 20));// Sorting people by age using StreamList<Person> sortedByAge = people.stream()//自然排序.sorted((p1, p2) -> Integer.compare(p1.getAge(), p2.getAge())).collect(Collectors.toList());// Displaying the sorted listsortedByAge.forEach(System.out::println);System.out.println("------------------自定义排序--------------");//先根据年龄再根据姓名排序List<Person> collect = people.stream().sorted((p1, p2) -> {if (p1.getAge() == p2.getAge()) {return p1.getName().compareTo(p2.getName());} else {return p2.getAge() - p1.getAge();}}).collect(Collectors.toList());collect.forEach(System.out::println);}
}
运行示例

在这里插入图片描述

总结

作用场景

Java Stream API 是用于处理集合和数据库的理想选择,它能够执行如排序、过滤或映射数据等聚合操作。Stream 支持并行处理,使得它能够有效地处理大型数据集。此外,Stream 在处理数据序列时能增强代码的可读性和减少样板代码,使编程更加表达和简洁。它在 Java 中的函数式编程模式中尤为有价值,帮助以声明方式操作集合。

优势和不足

优势
  1. 提高代码可读性和简洁性:通过流式表达式,可以用更少的代码完成复杂的集合处理,使代码更易于理解和维护。
  2. 支持并行处理:Stream API 设计支持并行执行,可以很容易地对数据进行并行处理,提高处理效率,尤其适用于处理大数据量。
  3. 函数式编程:支持函数式编程风格,有助于减少副作用,使程序更加稳定。
不足
  1. 性能开销:相对于传统的 for-loop,Stream 操作可能引入更多的性能开销,尤其是在小数据量或高性能场景中。
  2. 学习曲线:对于初学者,Stream API 的一些操作和概念可能比较难以理解,需要一定的学习投入。
  3. 调试困难:由于 Stream 操作的链式结构,调试可能比较复杂,特别是在流水线操作中定位问题可能比较困难。

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

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

相关文章

【QT进阶】Qt Web混合编程之使用ECharts显示各类折线图等

往期回顾 【QT进阶】Qt Web混合编程之QWebEngineView基本用法-CSDN博客 【QT进阶】Qt Web混合编程之CMake VS2019编译并使用QCefView&#xff08;图文并茂超详细版本&#xff09;-CSDN博客【QT进阶】Qt Web混合编程之html、 js的简单交互-CSDN博客 【QT进阶】Qt Web混合编程之使…

【MATLAB源码-第196期】基于matlab的A*融合DWA算法栅格路径规划仿真,画出路径图、姿态角度以及线角速度。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 A算法与DWA算法的融合是一个高效的路径规划策略&#xff0c;这种策略将A算法的全局路径规划能力与DWA算法的局部避障能力结合起来&#xff0c;以期达到更快、更安全的导航效果。以下是对这种融合策略的详细描述。 一、基本概…

Linux thermal框架介绍

RK3568温控 cat /sys/class/thermal/thermal_zone0/temp cat /sys/class/thermal/thermal_zone1/temp cat /sys/class/thermal/cooling_device0/cur_state cat /sys/class/thermal/cooling_device1/cur_state cat /sys/class/thermal/cooling_device2/cur_state thermal_zone…

信息打点--公众号服务

微信公众号 获取微信公众号的途径https://weixin.sogou.com/ 微信公众号没有第三方服务 Github监控 人员&域名&邮箱 eg&#xff1a;xxx.cn password in:file https://gitee.com/ https://github.com/ https://www.huzhan.com/ 资源搜索 in:name test 仓库标题搜索含有…

ASP.NET教务管理平台-权限及公共模块设计与开发

摘 要 随着教育改革的不断深化&#xff0c;高等院校的建设与发展对国民整体素质的提高起着越来越重要的作用&#xff0c;建立一套能够适应这些改变的行政管理方案也就显得尤为重要。对于教务处来说&#xff0c;将信息技术用于校务管理中便是迫切的要求。 教务系统中的用户…

产品规划|如何从0到1规划设计一款产品?

我们要如何从0到1规划设计一款产品?在前期工作我们需要做什么呢?下面这篇文章就是关于此的相关内容,大家一起往下看多多了解了解吧! 一、什么是产品规划? 产品规划是一种策略,它设定了产品的价值和目标,并确定实施方案以实现这些目标。它考虑了产品的整个生命周期,基于…

22长安杯电子取证复现(检材一,二)

检材一 先用VC容器挂载&#xff0c;拿到完整的检材 从检材一入手&#xff0c;火眼创建案件&#xff0c;打开检材一 1.检材1的SHA256值为 计算SHA256值&#xff0c;直接用火眼计算哈希计算 9E48BB2CAE5C1D93BAF572E3646D2ECD26080B70413DC7DC4131F88289F49E34 2.分析检材1&am…

dremio支持设置

Dremio 支持提供可用于诊断目的的设置。这些设置通过 Dremio UI&#xff1a;设置>支持启用&#xff08;或禁用&#xff09; 使用 Client Tools 可以配置当用户查看数据集中的数据时&#xff0c;Dremio 项目的工具栏上显示哪些客户端应用程序按钮。用户可以通过单击相应的工具…

海外媒体广告投放 - 大舍传媒助力企业迈向新台阶,实现精准投放

一、为何选择海外媒体广告投放 随着全球化进程的不断推进&#xff0c;越来越多的企业开始将目光投向国际市场。海外媒体广告投放作为一种有效的宣传手段&#xff0c;可以帮助企业在全球范围内提高品牌知名度和影响力&#xff0c;吸引潜在客户&#xff0c;促进产品销售。 二、…

12、【装饰器模式】动态地为对象添加新功能

你好&#xff0c;我是程序员雪球。 今天我们来聊聊 23 种设计模式中&#xff0c;一种常见的结构型模式&#xff0c;装饰器模式。聊聊它的设计思想、实现原理&#xff0c;应用场景&#xff0c;以及如何使用。 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型…

使用d3.js画一个BoxPlot

Box Plot 在画Box Plot之前&#xff0c;先来了解下Box Plot是什么&#xff1f; 箱线图&#xff08;Box Plot&#xff09;也称盒须图、盒式图或箱型图&#xff0c;是一种用于展示数据分布特征的统计图表。 它由以下几个部分组成&#xff1a; 箱子&#xff1a;表示数据的四分…

ruoyi element-ui 实现拖拉调整图片顺序

ruoyi element-ui 实现拖拉调整图片顺序 安装sortablejs https://sortablejs.com/npm 安装sortablejs npm install sortablejs --save相关options var sortable new Sortable(el, {group: "name", // or { name: "...", pull: [true, false, clone, …

甘特图:如何制定一个有效的产品运营规划?

做好一个产品的运营规划是一个复杂且系统的过程&#xff0c;涉及多个方面和阶段。以下是一些关键步骤和考虑因素&#xff0c;帮助你制定一个有效的产品运营规划&#xff1a; 1、明确产品定位和目标用户&#xff1a; 确定产品的核心功能、特点和优势&#xff0c;明确产品在市…

python自动生成SQL语句自动化

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python自动生成SQL语句自动化 在数据处理和管理中&#xff0c;SQL&#xff08;Structured …

统一SQL 支持Oracle CHAR和VARCHAR2 (size BYTE|CHAR)转换

统一SQL介绍 https://www.light-pg.com/docs/LTSQL/current/index.html 源和目标 源数据库&#xff1a;Oracle 目标数据库&#xff1a;Postgresql&#xff0c;TDSQL-MySQL&#xff0c;达梦8&#xff0c;LightDB-Oracle 操作目标 在Oracle中的CHAR和VARCHAR2数据类型&…

揭开ChatGPT面纱(1):准备工作(搭建开发环境运行OpenAI Demo)

文章目录 序言&#xff1a;探索人工智能的新篇章一、搭建开发环境二、编写并运行demo1.代码2.解析3.执行结果 本博客的gitlab仓库&#xff1a;地址&#xff0c;本博客对应01文件夹。 序言&#xff1a;探索人工智能的新篇章 随着人工智能技术的飞速发展&#xff0c;ChatGPT作为…

nginx服务访问页面白色

问题描述 访问一个域名服务返回页面空白&#xff0c;非响应404。报错如下图。 排查问题 域名解析正常&#xff0c;网络通讯正常&#xff0c;绕过解析地址访问源站IP地址端口访问正常&#xff0c;nginx无异常报错。 在打开文件时&#xff0c;发现无法打开配置文件&#xff0c…

982: 输出利用二叉树存储的普通树的度

解法&#xff1a; 由题意&#xff0c;根据二叉树求对应的合法普通树的度&#xff0c;度就是节点儿子数的最大值。 也就是左孩子&#xff0b;兄弟 在二叉树中就是某根节点的右孩子某根节点的右孩子的右孩子。。。 例AB#CD##E### 关于树概念不理解的可以看看981: 统计利用二叉…

牛客NC179 长度为 K 的重复字符子串【simple 哈希,滑动窗口 C++、Java、Go、PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/eced9a8a4b6c42b79c95ae5625e1d5fd 思路 哈希统计每个字符出现的次数。没在窗口内的字符要删除参考答案C class Solution {public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c…

记录Python链接mysql的数据库的2种操作方式

一、使用pymysql库方式 import pymysqldb pymysql.connect(hostlocalhost,userroot,password123456) #创建链接&#xff0c;在3.8以后好像已经不支持这个种链接方式了&#xff0c; #db pymysql.connect(localhost,root,123456) cursor db.cursor()#拿到游标这样我们就拿到了…