Java学习记录14

Stream流是为了解放程序员操作集合(Collection)时的生产力。它类似于一个高级的迭代器,但只能遍历一次。

要想操作流,需要有一个数据源,可以是数组或者集合。每次操作都会返回一个新的流对象,但原有的流对象会保持不变。

流的操作可分为两种类型:

1.中间操作,可以有多个,每次返回一个新的流,可进行链式操作。

2.终端操作,只能有一个,执行完不能执行下一个操作,只能放在最后。

中间操作不会立即执行,只有等到终端操作的时候,流才开始真正地遍历,用于映射、过滤等。简单点说,就是一次遍历执行多个操作,性能就大大提高了。

stream流中用到了一些接口:

Predicate    (接受一个输入参数返回一个布尔值结果)类型的参数。
Consumer(Java 8 新增的一个函数式接口,接受一个输入参数并且无返回的操作)类型的参数。
Function(Java 8 新增的一个函数式接口,接受一个输入参数 T,返回一个结果 R)类型的参数。
 

Stream流常用方法总结

创建流

如果是数组的话,可以使用Arrays.stream 或Stream.of,集合可以直接使用stream(),因为该方法已经添加到Collection接口中。

String[] arr = new String[]{"长沙","武汉","广东"};
Stream<String> arr1 = Stream.of(arr);
arr1.forEach(System.out::println); //长沙 武汉 广东
Arrays.stream(arr).forEach(System.out::println); //长沙 武汉 广东

具体方法

distinct()

返回由该流的不同元素(根据Object.equals(Object))组成的流。

ArrayList<String> list = new ArrayList<>();
list.add("武汉");
list.add("广东");
list.add("长沙");
list.add("武汉");
list.stream().distinct().forEach(System.out::println); //武汉 广东 长沙

count()

返回此流中元素的计数。

ArrayList<String> list = new ArrayList<>();
list.add("武汉");
list.add("广东");
list.add("长沙");
list.add("武汉");
System.out.println(list.stream().count()); //4

filter(Predicate<? super T> predicate)

返回一个流,该流由与给定谓词匹配的此流的元素组成。

ArrayList<String> list = new ArrayList<>();
list.add("武汉");
list.add("广东");
list.add("长沙");
list.add("武汉");
list.stream().filter(s -> s.endsWith("汉")).forEach(System.out::println);// 武汉 武汉

forEach(Consumer<? super T> action)

对此流的每个元素执行一个操作。

ArrayList<String> list = new ArrayList<>();
list.add("武汉");
list.add("广东");
list.add("长沙");
list.add("武汉");
list.stream().forEach(System.out::println);

map(Function<? super T, ? extends R> mapper)

返回一个流,该流由将给定函数应用于此流的元素的结果组成。

ArrayList<String> list = new ArrayList<>();
list.add("武汉");
list.add("广东");
list.add("长沙");
list.add("武汉");
list.stream().map(s -> s.length()).forEach(System.out::println);

anyMatch()

返回此流的任何元素是否与提供的谓词匹配。

allMatch()

返回此流的所有元素是否与提供的谓词匹配。

noneMatch()

返回此流中是否没有元素与提供的谓词匹配。

List<String> list = new ArrayList<>();
list.add("王阳明");
list.add("王世明");
list.add("亚森");
list.add("川海笑");

boolean  anyMatchFlag = list.stream().anyMatch(element -> element.contains("王"));
boolean  allMatchFlag = list.stream().allMatch(element -> element.length() > 1);
boolean  noneMatchFlag = list.stream().noneMatch(element -> element.endsWith("沉"));
System.out.println(anyMatchFlag); //true
System.out.println(allMatchFlag); //true
System.out.println(noneMatchFlag); //true

reduce()

reduce()方法的主要作用是把Stream中的元素组合起来,它有两种用法:

Optinal<T> reduce(BinaryOperator<T> accumulator)

没有起始值,只有一个参数是运算规则,此时返回Optional。

Optinal<T> reduce(T identity, BinaryOperator<T> accumulator)

有起始值和运算规则,两个参数,此时返回的类型和起始值类型一致。

Integer[] ints = {0, 1, 2, 3, 4};
List<Integer> list = Arrays.asList(ints);

Optional<Integer> optional = list.stream().reduce((a, b) -> a + b); 
Optional<Integer> optional1 = list.stream().reduce(Integer::sum); 
System.out.println(optional.get()); //10
System.out.println(optional1.get()); //10

int reduce = list.stream().reduce(6, (a, b) -> a + b);
System.out.println(reduce); //16
int reduce1 = list.stream().reduce(6, Integer::sum);
System.out.println(reduce1); //16

collect(Collector<? super T,A,R> collector)

使用Collector对此流的元素执行可变减少操作。

String[] strings = new String[] {"武汉","长沙","广东"};
List<String> collect = Arrays.stream(strings).collect(Collectors.toList());
System.out.println(collect.toString()); //[武汉, 长沙, 广东]

List<String> list = Stream.of(strings).toList();
System.out.println(list.toString());    //[武汉, 长沙, 广东]

toArray(IntFunction<A[]> generator)

返回一个包含此流元素的数组,使用提供的generator函数分配返回的数组,以及分区执行或调整大小可能需要的任何其他数组。

List<String> list = new ArrayList<>();
list.add("武汉");
list.add("长沙");
list.add("广东");
String[] array = list.stream().toArray(String[]::new);
System.out.println(Arrays.toString(array)); //[武汉, 长沙, 广东]

sorted(Comparator<? super T> comparator)

返回一个流,该流由该流的元素组成,并按自然顺序排序。

int[] nums = new int[]{7,11,8,10,5};
int[] array = Arrays.stream(nums).sorted().toArray();
System.out.println(Arrays.toString(array)); //[5, 7, 8, 10, 11]

limit(long maxSize)

返回由该流的元素组成的流,截断后的长度不超过maxSize。

int[] nums = new int[]{7,11,8,10,5};
int[] array = Arrays.stream(nums).limit(3).toArray();
System.out.println(Arrays.toString(array)); //[7, 11, 8]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ffmpeg视频滤镜:提取缩略图-framestep

滤镜描述 官网地址 > FFmpeg Filters Documentation 这个滤镜会间隔N帧抽取一帧图片&#xff0c;因此这个可以用于设置视频的缩略图。总体上这个滤镜比较简单。 滤镜使用 滤镜参数 framestep AVOptions:step <int> ..FV....... set frame st…

【C++11】可变参数模板/新的类功能/lambda/包装器--C++

文章目录 一、可变参数模板1、基本语法及原理2、包扩展3、empalce系列接口 二、新的类功能1、默认的移动构造和移动赋值2、成员变量声明时给缺省值3、defult和delete4、final与override 三、STL中一些变化四、lambda1、lambda表达式语法2、捕捉列表3、lambda的应用4、lambda的原…

云网络基础- TCP/IP 协议

文章目录 典型服务模式TCP/IP 协议设置和查看IPIP地址的分类:IP地址组成: 网络位主机位组成克隆:产生一台新的虚拟机win2008 典型服务模式 • C/S,Client/Server架构 – 由服务器提供资源或某种功能 – 客户机使用资源或功能 TCP/IP 协议 • TCP/IP是最广泛支持的通信协议集合…

java基础知识(Math类)

引入&#xff1a;Math 类包含用于执行基本数学运算的方法&#xff0c;如初等指数、对数、平方根 import java.util.Math 1.abs绝对值 int abs Math.abs(-9); 2.pow求幂 double pow Math.pow(2,4); 3.向上取整 double ceil Math.ceil(3.9);//ceil 4 4.向下取整 dou…

什么是 WPF 中的依赖属性?有什么作用?

依赖属性&#xff08;Dependency Property&#xff09;是 WPF 的一个核心概念&#xff0c;它为传统的 .NET 属性提供了增强功能&#xff0c;支持绑定、样式、动画和默认值等功能。通过依赖属性&#xff0c;WPF 提供了一种灵活的数据驱动的方式来处理 UI 属性。 1. 什么是依赖属…

线性代数空间理解

学习线性代数已经很久&#xff0c;但是在使用过程中仍然还是不明所以&#xff0c;比如不知道特征向量和特征值的含义、矩阵的相乘是什么意思、如何理解矩阵的秩……。随着遇到的次数越来越多&#xff0c;因此我决定需要对线性代数的本质做一次深刻的探讨了。 本次主要是参考了3…

Jmeter的组件执行顺序

在 Apache JMeter 中&#xff0c;组件的加载和执行顺序遵循一定的规则&#xff0c;但有些组件在同一层级中可能会根据它们在测试计划中的位置来决定具体的执行顺序。以下是这些组件的大致加载和执行顺序&#xff0c;以及哪些组件属于同一层级&#xff1a; 线程组&#xff08;Th…

计算机网络八股整理(一)

计算机网络八股文整理 一&#xff1a;网络模型 1&#xff1a;网络osi模型和tcp/ip模型分别介绍一下 osi模型是国际标准的网络模型&#xff0c;它由七层组成&#xff0c;从上到下分别是&#xff1a;应用层&#xff0c;表示层&#xff0c;会话层&#xff0c;传输层&#xff0c;…

今天你学C++了吗?——C++中的类与对象(第二集)

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…

【C++习题】14.滑动窗口_找到字符串中所有字母异位词

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a;图解 题目链接&#xff1a; 438. 找到字符串中所有字母异位词 题目描述&#xff1a; 解法 暴力解法&#xff1a; 字母排序后运用滑动窗口解题。 滑动窗口哈希表&#xff1a; 我们可以优化一下&am…

Spring Boot集成MyBatis-Plus:自定义拦截器实现动态表名切换

Spring Boot集成MyBatis-Plus&#xff1a;自定义拦截器实现动态表名切换 一、引言 介绍动态表名的场景需求&#xff0c;比如多租户系统、分表分库&#xff0c;或者不同业务模块共用一套代码但操作不同表。说明 MyBatis-Plus 默认绑定固定表名的问题。 二、项目配置 1. 集成 M…

深入探索API爬虫工作的技术难点与高效解决思路

在大数据与信息化高速发展的今天&#xff0c;API&#xff08;应用程序编程接口&#xff09;爬虫成为了数据收集与分析的重要工具。然而&#xff0c;API爬虫工作并非一帆风顺&#xff0c;它面临着诸多技术挑战。本文将深入探讨几个API爬虫工作的技术难点&#xff0c;并提出相应的…

css效果

css炫彩流光圆环效果 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title><style>*{margin: 0;padding: 0;}body{width: 100%;height: 100vh;}.container{position: relative;width: 100%;height: 100vh…

arm Rk1126 编译Qt工程报错: Could not find qmake spec

首先修改qmake.conf文件&#xff0c;配置好正确的交叉编译工具&#xff1a; 然后执行编译&#xff1a; /opt/Rv1126/Rv1126-盒子代码/rv1126-qt5-sdk/bin/qmake untitled.pro 报错。 原因&#xff1a;中文路径。修改路径为英文路径即可

zabbix监控进程

使用zabbix监控指定的进程&#xff0c;现在主要使用监控一些用java python写的一些微服务模块&#xff0c;我这边用于演示就直接使用nginx服务来演示了 创建监控项 name - 进程名称&#xff08;默认为 ALL PROCESSES);user - 用户名&#xff08;默认为 all users);state - 可能…

php 导出excel 一个单元格 多张图片

public function dumpData(){error_reporting(0); // 禁止错误信息输出ini_set(display_errors, 0); // 不显示错误$limit $this->request->post(limit, 20, intval);$offset $this->request->post(offset, 0, intval);$page floor($offset / $limit) 1 ;$wh…

【C++11】锋芒毕露

(续) 一、可变参数模板 C11支持可变参数模板&#xff0c;也就是说支持可变数量参数的函数模板和类模板&#xff0c;可变数目的参数被称 为参数包&#xff0c;存在两种参数包&#xff1a;模板参数包&#xff0c;表示零或多个模板参数&#xff1b;函数参数包&#xff1a;表示零…

用户管理(MySQL)

目录 1用户管理&#xff08;MySQL&#xff09; 1.1 用户 1.1.1 用户信息 1.1.2 创建用户(后%是可以任意远端登录) 1.1.3 刷新一下 1.1.4 删除用户 1.1.5 修改用户密码 1.2 数据库的权限 1.2.1 登录创建用户 1.2.2给权限 1.2.2.1 把jj数据库中uu表的权限给woaini这个…

Hive离线数仓结构分析

Hive离线数仓结构 首先&#xff0c;在数据源部分&#xff0c;包括源业务库、用户日志、爬虫数据和系统日志&#xff0c;这些都是数据的源头。这些数据通过Sqoop、DataX或 Flume 工具进行提取和导入操作。这些工具负责将不同来源的数据传输到基于 Hive 的离线数据仓库中。 在离线…

Linux——Uboot命令使用

什么是Uboot&#xff1f; 1&#xff09;Uboot是一个裸机程序&#xff0c;比较复杂。类似我们PC机的BIOS程序。 2&#xff09;Uboot就是一个bootloader&#xff0c;作用就是用于启动Linux或者其他系统&#xff0c;Uboot最主要的工作是初始化DDR&#xff0c;因为Linux的运行是运行…