Stream流常用操作

一、中间操作

中间操作是返回一个新的流,并在返回的流中包含所有之前的操作结果。它们总是延迟计算,这意味着它们只会在终止操作时执行,这样可以最大限度地优化资源使用。

1. filter(过滤)

filter()方法接受一个谓词(一个返回boolean值的函数),并返回一个流,其中仅包含通过该谓词的元素。
eg:从一个数组中筛选出长度大于5的元素。

@Test
public void testFilter() {
    List<String> names = Arrays.asList("Chengdu", "Shanghai", "Changsha", "Wuhan", "Hangzhou");
    List<String> collect = names.stream().filter(item -> item.length() > 5).collect(Collectors.toList());
    System.out.println(collect);
}

image.png

2. map(转换)

map()方法可将一个流的元素转换为另一个流。它接受一个函数,该函数映射流中的每个元素到另一个元素。
eg:对数字列表中的每个元素进行乘以 2 的操作,并将操作后的结果保存到新的列表中。

@Test
public void testMap() {
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    List<Integer> collect = numbers.stream().map(n -> {
        n = n * 2;
        return n;
    }).collect(Collectors.toList());
    
    for (Integer integer : collect) {
        System.out.println("integer = " + integer);
    }
}

image.png
eg:将结果转换为Map。

@Test
public void testMapToMap() {
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    Map<Byte, Integer> collect = numbers.stream().collect(Collectors.toMap(Integer::byteValue, item -> item * 2, (val1, val2) -> val2));

    for (Map.Entry<Byte, Integer> byteIntegerEntry : collect.entrySet()) {
        Byte key = byteIntegerEntry.getKey();
        System.out.println("key = " + key + ",Value = " + byteIntegerEntry.getValue());
    }
}

image.png

  1. 首先创建了一个包含数字 1~5 的列表。然后利用 stream() 方法将列表转换成 Stream 对象。
  2. 接下来调用 collect(Collectors.toMap(…)) 方法将 Stream 转换成 Map<Byte, Integer>
  3. toMap ()方法中,以每个整数的字节值为键,该整数乘以 2 为值,当遇到重复的键时取最后一个值。(这里实际上可以用任何能区分不同键的方式作为第一个参数,而不一定是 Integer::byteValue
  4. 最后,在 for 循环中遍历了这个 Map 并打印出每个键值对的内容。

3. sorted(排序)

sorted()方法可对流进行排序。它可以接受一个Comparator参数,也可以使用自然排序Ordering.natural()。默认排序是按升序排序。
eg:对数组元素排序。

@Test
public void testSorted() {
    int[] numbers = {5, 2, 8, 3, 7};
    int[] sortedNumbers = Arrays.stream(numbers).sorted().toArray();
    System.out.println(Arrays.toString(sortedNumbers));
}

image.png

  1. 首先创建了一个包含整数的数组numbers。
  2. 然后使用Arrays.stream()方法将其转化为一个IntStream流。
  3. 接下来使用sorted()方法对流中的元素进行排序操作,返回一个新的排序后的IntStream流。
  4. 最后,使用toArray()方法将排序后的结果转换为一个新的int类型数组sortedNumbers,并使用Arrays.toString()方法将结果输出到控制台。

4. distinct(去重)

distinct()方法从流中返回所有不同的元素。在内部,它使用equals()方法来比较元素是否相同。因此,我们需要确保equals()方法已正确实现。
eg:去除list集合中重复的元素。

@Test
public void testDistinct() {
    List<Integer> numbers = Arrays.asList(1, 2, 3, 2, 1);
    List<Integer> collect = numbers.stream().distinct().collect(Collectors.toList());
    System.out.println(collect);
}

image.png

  1. 首先创建了一个包含整数的List集合numbers,其中包含了若干个重复的整数。
  2. 接下来使用Stream()方法将其转化为一个Stream流。使用distinct()方法对流中的元素进行去重操作,返回一个新的不包含重复元素的Stream流collect。
  3. 最后使用collect()方法将去重后的结果转换成一个List集合,并使用System.out.println()方法输出到控制台。

使用Stream流中的distinct()方法可以快速地对集合中的重复元素进行去重处理。在这段代码中,集合中的元素都是整数,使用distinct()方法去除了所有重复的整数,返回一个新的元素不重复且顺序不变的List集合。

5. limit(限制)

limit()方法可以将流限制为指定的元素数。
eg:输出数组中前三个数。

@Test
public void testLimit() {
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
    List<Integer> collect = numbers.stream().limit(3).collect(Collectors.toList());
    System.out.println(collect);
}

image.png

  1. 首先创建了一个包含整数的List集合numbers,其中包含了10个整数。
  2. 接下来使用Stream()方法将其转化为一个Stream流。使用limit()方法对流中的元素进行限制操作,仅保留前3个元素,返回一个新的只包含前3个元素的Stream流collect。
  3. 最后使用collect()方法将限制操作后的结果转化为一个新的List集合,并使用System.out.println()方法输出到控制台。

6. skip(跳过)

skip()方法可跳过前N个元素。
eg:跳过数组的前三个数。

@Test
public void testSkip() {
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
    List<Integer> collect = numbers.stream().skip(3).collect(Collectors.toList());
    System.out.println(collect);
}

image.png

  1. 首先创建了一个包含整数的List集合numbers,其中包含了5个整数。
  2. 接下来使用Stream()方法将其转化为一个Stream流。使用skip()方法对流中的元素进行跳过操作,跳过前2个元素,返回一个新的不包含前2个元素的Stream流collect。
  3. 最后使用collect()方法将跳过操作后的结果转化为一个新的List集合,并使用System.out.println()方法输出到控制台。

7. peek(展示)

peek()方法可以用于在Stream流中获取元素同时执行一些操作,如打印、调试、观察等。通常会与其他的方法联合使用。
eg:输出元素。

 @Test
public void testPeek() {
    List<String> names = Arrays.asList("Chengdu", "Shanghai", "Changsha", "Guangzhou");
    List<String> filteredNames = names.stream()
            .peek(System.out::println)
            .filter(name -> name.startsWith("C"))
            .peek(name -> System.out.println("Filtered value: " + name))
            .collect(Collectors.toList());
    System.out.println("-----------------------------------------------------------------");
    System.out.println(filteredNames);
}

image.png

  1. 首先创建了一个列表 names 包含四个字符串元素,使用流式操作处理这个列表。
  2. 然后使用 peek() 方法将每个元素打印到控制台,使用 filter() 方法过滤掉不符合条件的元素,即不以字母 C 开头的字符串。
  3. 接下来再次使用 peek() 方法将符合条件的字符串打印到控制台,以便验证过滤操作的效果。
  4. 最后使用 collect() 方法将符合条件的字符串收集到一个新的列表 filteredNames 中,并输出该列表。

二、终止操作

终止操作返回一个结果或副作用(例如:显示控制台输出),并将流关闭。

1. forEach(遍历)

forEach()方法可将给定的方法应用于流中的每个元素。该方法是一种消费流的方式,不会返回值。
eg:数组元素遍历。

@Test
public void testForEach() {
    List<String> names = Arrays.asList("Chengdu", "Shanghai", "Wuhan", "Changsha");
    names.stream().forEach(System.out::println);
}

image.png

  1. 创建了一个包含四个字符串元素的列表 names。
  2. 使用流式操作将每个元素打印到控制台。具体来说,它使用 forEach() 方法遍历列表中的所有元素,并对每个元素执行打印操作。

2. collect(收集)

collect()方法可以将流中的元素收集到一个集合中。一般与其他方法配合使用。
eg:收集数组中能被25整除的数。

@Test
public void testCollect() {
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    List<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());
    System.out.println(evenNumbers);
}

image.png

  1. 首先创建了一个包含整数的列表 numbers,使用流式操作筛选出所有偶数。
  2. 然后将它们收集到一个新的列表 evenNumbers 中,并打印输出。

这里使用了 filter() 方法过滤掉所有奇数元素,只保留所有偶数元素,并使用 collect() 方法将它们收集到一个新的列表 evenNumbers 中。只有偶数元素被保留在了新列表 evenNumbers 中,而奇数元素全部被过滤掉了。而且,在筛选偶数元素时,使用了 lambda 表达式 n -> n % 2 == 0,其中 % 表示取模操作,判断当前数是否为偶数。如果 n % 2 的结果是 0,就把 n 这个数保留下来,否则就过滤掉。

3. count(计数)

count()方法可以返回流中的元素数。
eg:计算数组元素个数。

@Test
public void testCount() {
    List<String> names = Arrays.asList("Chengdu", "Guangzhou", "Wuhan", "Changsha");
    long count = names.stream().count();
    System.out.println(count);
}

image.png

  1. 首先创建了一个包含四个字符串元素的列表 names,使用流式操作计算出它包含的元素数量(即列表大小),并将该数量打印到控制台。

这里使用了 count() 方法统计列表中元素的个数。count() 方法返回的是一个 long 类型的值,表示列表中元素的个数。因为列表 names 包含了四个元素,所以 count() 方法返回值为 4,最终被打印输出到了控制台。

4. reduce(聚合)

reduce()方法可以将流元素聚合为单个结果。它接受一个BinaryOperator参数作为累加器。
eg:计算数组元素的和。

@Test
public void testReduce() {
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    Optional<Integer> sum = numbers.stream().reduce((a, b) -> a + b);
    System.out.println(sum);
}

image.png

  1. 首先创建了一个包含整数的列表 numbers,使用流式操作将它们累加起来得到总和,并将结果打印输出。

这里使用了 reduce() 方法对列表中的所有元素进行累加操作。reduce() 方法接收一个 BinaryOperator 函数作为参数,用于指定如何处理相邻的两个元素并返回一个新的结果值。reduce() 方法返回的是一个 Optional 类型的值,表示结果可能存在也可能不存在(例如当列表为空时)。由于列表 numbers 包含 1 到 5 共五个元素,因此 reduce() 方法的操作过程如下:
1 + 2 = 3
3 + 3 = 6
6 + 4 = 10
10 + 5 = 15
最终得到的结果 15 被包装成 Optional 类型的对象并打印输出到控制台。

5. anyMatch(任意匹配)

anyMatch()方法如果至少有一个元素与给定的谓词匹配,则返回true。
eg:判断数组元素中是否有以W开头的,有返回true,无返回false。

@Test
public void anyMatch() {
    List<String> names = Arrays.asList("Chengdu", "Guangzhou", "Wuhan", "Changsha");
    boolean anyStartsWithB = names.stream().anyMatch(name -> name.startsWith("W"));
    System.out.println(anyStartsWithB);
}

image.png

  1. 首先创建了一个包含四个字符串元素的列表 names,使用流式操作检查其中是否有任意一个元素以字母 “W” 开头,并将检查结果(布尔值)打印输出。

这里使用了 anyMatch() 方法匹配列表中的所有元素,并依次对每个元素执行指定的谓词操作(这里是以 “W” 开头),只要有一个元素符合条件,就返回 true,否则返回 false。列表 names 中包含了一个以字母 “W” 开头的元素 “Wuhan”,因此 anyMatch() 方法返回 true,最终被打印输出到了控制台。

6. oneMatch(无匹配)

noneMatch()方法,如果没有任何元素与给定谓词匹配,则返回true。
eg:判断数组元素中是否有以H开头的,无返回true,有返回false。

@Test
public void testToneMatch() {
    List<String> names = Arrays.asList("Chengdu", "Guangzhou", "Wuhan", "Changsha");
    boolean noneStartsWithB = names.stream().noneMatch(name -> name.startsWith("H"));
    System.out.println(noneStartsWithB);
}

image.png

  1. 首先创建了一个包含四个字符串元素的列表 names,使用流式操作检查其中是否没有任意一个元素以字母 “H” 开头,并将检查结果(布尔值)打印输出。

这里使用了 noneMatch() 方法匹配列表中的所有元素,并依次对每个元素执行指定的谓词操作(这里是以 “H” 开头),只有当所有元素都不符合条件时,才返回 true,否则返回 false。列表 names 中不包含任何一个以字母 “H” 开头的元素,因此 noneMatch() 方法返回 true,最终被打印输出到了控制台。

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

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

相关文章

栈和队列的基本见解

1.栈 1.1栈的基本概念和结构&#xff1a; 栈是一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出的原则。 压栈&#xff1a;栈的插入操作叫做进栈/压栈…

【java程序设计期末复习】chapter2 基本数据类型与数组

基本数据类型与数组 一&#xff0c;标识符和关键字 标识符 定义 用来标识类名、变量名、方法名、类型名、数组名、文件名的有效字符序列称为标识符&#xff0c;简单地说&#xff0c;标识符就是一个名字 。 性质 &#xff08;1&#xff09;标识符由字母、下划线、美元符号和…

cocos creator做圆形进度条

效果图&#xff1a; 我们在开发过程中经常要用到圆形进度条&#xff0c;例如技能CD 原文链接 之前写了一篇cocos2dx-lua_ProgressTimer创建扇形进度条,这里简单记录下在cocosCreator中如何制作。 具体方法 cocosCreator做起来比2dx还是要简单很多&#xff0c;首先给节点添加p…

PageHelper分页

文章目录 PageHelper分页ThreadLocalMap和ThreadLocal执行完PageHelper.startPage之后&#xff0c;分页参数存储到哪里了&#xff1f;Page和List的关系&#xff1f;PageInterceptor分页拦截器的作用&#xff1f;PageInfo的作用与结构&#xff1f;最后看下引入的pagehelper分页依…

Linux-部分:实用指令

1 指定运行级别 1&#xff09;基本介绍&#xff1a; 运行级别说明&#xff1a; 0&#xff1a;关机1&#xff1a;单用户【找回丢失密码】2&#xff1a;多用户状态没有网络服务3&#xff1a;多用户状态有网络服务4&#xff1a;系统未使用保留给用户5&#xff1a;图形界面6&…

新业务 新市场 | 灵途科技新品亮相马来西亚亚洲防务展

5月6日&#xff0c;灵途科技携新品模组与武汉长盈通光电&#xff08;股票代码&#xff1a;688143&#xff09;携手参加第18届马来西亚亚洲防务展。首次亮相海外&#xff0c;灵途科技便收获全球客户的广泛关注&#xff0c;为公司海外市场开拓打下坚实基础。 灵途科技与长盈通共同…

基于Llama 3搭建中文版(Llama3-Chinese-Chat)大模型对话聊天机器人

前面两篇博文&#xff0c;我们分别在个人笔记本电脑部署了Llama 3 8B参数大模型&#xff0c;并使用Ollama搭建了基于 Web 可视化对话聊天机器人&#xff0c;可以在自己电脑上愉快的与Llama大模型 Web 机器人对话聊天了。但在使用过程中&#xff0c;笔者发现Llama大模型经常出现…

避免锁表:为Update语句中的Where条件添加索引字段

最近在灰度环境中遇到一个问题&#xff1a;某项业务在创建数据时耗时异常长&#xff0c;但同样的代码在预发环境中并未出现此问题。起初我们以为是调用第三方接口导致的性能问题&#xff0c;但通过日志分析发现第三方接口的响应时间正常。最终&#xff0c;我们发现工单表的数据…

【C++】C++11(一)

C11是一次里程碑式的更新&#xff0c;我们一起来看一看~ 目录 列表初始化&#xff1a;{ }初始化&#xff1a;std::initializer_list&#xff1a; 声明&#xff1a;auto&#xff1a;decltype&#xff1a; STL的一些变化&#xff1a; 列表初始化&#xff1a; { }初始化&#xf…

音视频开发4-补充 FFmpeg 开发环境搭建 -- 在windows 上重新build ffmpeg

本节的目的是在windows 上 编译 ffmpeg 源码&#xff0c;这样做的目的是&#xff1a;在工作中可以根据工作的实际内容裁剪 ffmpeg&#xff0c;或者改动 ffmpeg 的源码。 第一步 &#xff1a;下载&#xff0c; 安装&#xff0c;配置 &#xff0c;运行 msys64 下载 下载地址&…

如何使用ssh将vscode 连接到服务器上,手把手指导

一、背景 我们在开发时&#xff0c;经常是window上安装一个vscode编辑器&#xff0c;去连接一个虚拟机上的linux&#xff0c;这里常用的是SSH协议&#xff0c;了解其中的操作非常必要。 二、SSH协议 SSH&#xff08;Secure Shell&#xff09;是一种安全协议&#xff0c;用于…

某某某加固系统分析

某某某加固系统内核so dump和修复&#xff1a; 某某某加固系统采取了内外两层native代码模式&#xff0c;外层主要为了保护内层核心代码&#xff0c;从分析来看外层模块主要用来反调试&#xff0c;释放内层模块&#xff0c;维护内存模块的某些运行环境达到防止分离内外模块&am…

vulnhub靶机De-ICE_S2.100_(de-ice.net-2.100-1.0)

下载地址&#xff1a;https://download.vulnhub.com/deice/De-ICE_S2.100_%28de-ice.net-2.100-1.0%29.iso 靶机搭建 注意下载下来的是iso文件接下来说明系统选择 linux的Debian 7.x就可以 然后注意一点我们需要创建一个192.168.2.0/24的网卡进行连接&#xff08;靶机ip地址…

RTOS(3)极简ARM架构与汇编

1.掌握八条汇编指令即可 读内存loadLDR R0&#xff0c;[addrA]写内存storeSTR R0&#xff0c;[addrA]加ADD R0&#xff0c;R1&#xff0c;R2减SUB R0&#xff0c;R1&#xff0c;R2比较CMP R0&#xff0c;R1跳转B / BL入栈PUSH { R3&#xff0c;LR }出…

OpenStack平台Glance管理

1. 规划节点 使用OpenStack平台节点规划。 IP主机名节点192.168.100.10controller控制节点192.168.100.20compute计算节点 2. 基础准备 使用实战案例-部署的OpenStack平台。 IP 主机名 节点 192.168.100.10 controller 控制节点 192.168.100.20 copute 计算节点 02 案例分…

基于机器学习判断面部微表情发现哪些人更容易诊有帕金森病

1. 概述 帕金森病&#xff08;Parkinson’s disease&#xff0c;PD&#xff09;是一种慢性、进展性的神经退行性疾病&#xff0c;主要影响运动系统。该病症以大脑中黑质致密部多巴胺能神经元的逐渐丧失为特征&#xff0c;导致多巴胺&#xff08;一种重要的神经递质&#xff09…

门禁-jenkins的构建状态同步到gitlab提交流水线

API接口文档 https://docs.gitlab.cn/jh/api/commits.html 配置pipline流水线 生成http请求代码&#xff1a; 使用HttpRequest插件生成 - sharelibs内容 //这是share libs里的 package devopsdef httpReq(reqType, reqUrl, reqBody, accessToken){def gitServer "…

Radware Alteon负载均衡-配置证书组

证书组&#xff1a;可以使用证书组将多个服务器证书与虚拟服务相关联。这提供了对服务器名称指示(Server Namelndication&#xff0c;SNI)的支持&#xff0c;允许在相同的IP和端口后面托管多个主机名。使用SNI&#xff0c;浏览器发送请求的主机名&#xff0c;使服务器能够在进行…

滤波电路应用笔记

滤波器 什么是滤波器&#xff1f; 滤波器是一种使某些频率或频带上的电信号通过而阻止其他信号通过的装置。 滤波电路的作用是尽可能减少脉动直流电压中的交流分量&#xff0c;保持其直流分量&#xff0c;降低输出电压的纹波系数&#xff0c;并使波形相对平滑。整流电路的输出…