Stream流常用操作

news2024/11/14 2:31:06

一、中间操作

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

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,最终被打印输出到了控制台。

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

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

相关文章

Vue.js条件渲染与列表渲染指南

title: Vue.js条件渲染与列表渲染指南 date: 2024/5/26 20:11:49 updated: 2024/5/26 20:11:49 categories: 前端开发 tags: VueJS前端开发数据绑定列表渲染状态管理路由配置性能优化 第1章&#xff1a;Vue.js基础与环境设置 1.1 Vue.js简介 Vue.js (读音&#xff1a;/vju…

每日一问-如何设置VS Code 中 Markdown粘贴图片的位置

VS Code内的markdown编辑器应该算是比较好用的&#xff0c;但是有一个问题一直困扰着我&#xff0c;就是在编辑markdown文件时&#xff0c;粘贴图片的位置问题。默认情况下&#xff0c;VS Code会将粘贴的图片放在markdown文件的同级目录下&#xff0c;这样会导致markdown文件的…

【代码随想录——回溯算法二周目】

1. 组合总和 var (path []intres [][]int )func combinationSum(candidates []int, target int) [][]int {path make([]int, 0)res make([][]int, 0)dfs(candidates,target,0,0)return res }func dfs(candidates []int, target int,tempTarget int,start int) {if tempTarg…

1、Introduction to Python【Python简介】

主要目的是回顾一下主要的Python基础知识&#xff0c;当作复习。 1、使用Type查看变量属性 a 10 print(type(a)) 2、向列表中加入元素 fam [lisa, 1.74] fam [emma, 1.79]# fam [lisa, 1.74, emma, 1.79] 3、删除列表中某个元素 del(fam[index]) 4、列表具有唯一性 …

ASP.NET MVC 快速入门(图文版)

今年是2024年了&#xff0c;没有多少人在ASP.NET 去做开发&#xff0c;都使用ABP框架 &#xff0c;不过我们仍然需要了解ASP.NET MVC 的一个开发流程 MVC概述 MVC是当前比较流行的WEB程序开发模式之一&#xff0c;ASP.NET MVC是.Net对MVC的一种实现。MVC&#xff08;Model View…

CobaltStrike渗透框架进阶之扩展脚本和MSF联动

CobaltStrike扩展脚本 扩展是Cobaltstrike一个极为重要的模块&#xff0c;它有效地丰盈了cobaltstrike的功能 选择菜单栏的CobaltStrike–>脚本管理器&#xff0c;点击load&#xff0c;然后选择cna扩展文件即可&#xff0c;旁边的unload为去除该扩展&#xff0c;&#xff…

【iOS开发】—— KVC

【iOS开发】—— KVC 一. KVC的定义key和keyPath的区别用法&#xff1a; 批量复制操作字典模型相互转化KVC的其他方法 KVC原理赋值原理取值原理 一. KVC的定义 KVC&#xff08;Key-value coding&#xff09;键值编码&#xff0c;就是指iOS的开发中&#xff0c;可以允许开发者通…

3D牙科网格分割使用基于语义的特征学习与图变换器

文章目录 3D Dental Mesh Segmentation Using Semantics-Based Feature Learning with Graph-Transformer摘要方法实验结果 3D Dental Mesh Segmentation Using Semantics-Based Feature Learning with Graph-Transformer 摘要 本文提出了一种新颖的基于语义的牙科网格分割方…

小程序怎么改名

经常有商家想要对自己的小程序进行重命名&#xff0c;改名可能是为了更好地与品牌形象以及业务相匹配&#xff0c;也可能是为了更好地吸引用户。那么如何才能更名呢&#xff1f; 一、准备几个新名字。 在决定改名之前&#xff0c;首先要确定几个新的小程序名字。为什么要准备…

CCF20231201——仓库规划

CCF20231201——仓库规划 代码如下&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int n,m,a[1001][11],b[1001]{0};cin>>n>>m;for(int i1;i<n;i){for(int j1;j<m;j)cin>>a[i][j];}for(int i1;i<n;i){bool foundfals…

Excel必知必会

文章目录 基础概念数据格式选择区域内指定格式数据多行筛选数据转换数据格式固定首行和首列在滚动时一直显示指定列数据符合预期批量填充公式 函数VLOOKUP函数 基础概念 数据格式 文本&#xff0c;数值&#xff08;默认值0&#xff09;&#xff0c;&#xff08;逻辑值&#x…

ciscn2024(上传一下,有侵权什么的问题的话联系删除)

Web Simple_php 这个Simple_php一点儿也不Simple (⋟﹏⋞) 源码放这儿了&#xff1a; <?phpini_set(open_basedir, /var/www/html/); error_reporting(0);if(isset($_POST[cmd])){$cmd escapeshellcmd($_POST[cmd]); if (!preg_match(/ls|dir|nl|nc|cat|tail|more|flag…

部署ELK日志分析系统——超详细

ELK日志分析系统 文章目录 ELK日志分析系统资源列表基础环境一、环境准备二、部署Elasticsearch软件2.1、安装Elasticsearch软件2.2、加载系统服务2.3、更改Elasticsearch主配置文件2.4、创建数据存放路径并授权2.5、启动Elasticsearch2.6、查看节点信息 三、安装Elasticsearch…

如何使用GPT-4o?

GPT-4o的时代已经到来&#xff01;昨天分享群有小伙伴询问怎么使用GPT-4o&#xff1f; 在接下来的几周&#xff0c;OpenAI将陆续向所有用户开放GPT-4o的访问权限。无论是ChatGPT Free、Plus还是Team的用户&#xff0c;都能享受到GPT-4o带来的创新体验&#xff08;企业版也已经…

Go语言之GORM框架(二) ——GORM的单表操作

前言 在上一篇文章中&#xff0c;我们对Gorm进行了介绍&#xff0c;而在这一篇文章中我们主要介绍GORM的单表查询与Hook函数,在进行今天的内容之前我们先事先说明一下&#xff0c;下面我们对单表进行操作的表结构如下&#xff1a; type Student struct {ID uint gorm:&qu…

贪心-AcWing 1522. 排成最小的数字-XMUOJ石板序列

题目 思路 getline() 是 C 标准库中的一个函数&#xff0c;用于从输入流中读取一行文本&#xff0c;并将其存储为字符串。它可以从标准输入、文件流、字符串流等不同类型的输入流中读取数据。C中istringstream、ostringstream、stringstream详细介绍和使用_c istringstream-CS…

智能合约语言(eDSL)—— 并行化方案 2

这个并行算法最初其实是在aptos上实现的&#xff0c;aptos上使用的是move虚拟机&#xff0c;后来我把它移植到我们链上了&#xff0c;但是wasm虚拟机。还是费了不少事情。 目前evm并行也比较火&#xff0c;像monad&#xff0c;sei等。经过调研发现&#xff0c;其实evm的并行&am…

代码随想录|Day42|动态规划 part07|● 70. 爬楼梯 (进阶)● 322. 零钱兑换 ● 279.完全平方数

70. 爬楼梯 &#xff08;进阶&#xff09; 322. 零钱兑换 class Solution: def climbStairs(self, n: int) -> int: if n < 1: return n dp [0] * (n 1) dp[0] 0 dp[1] 1 dp[2] 2 for i in range(3, n 1): dp[i] dp[i - 1] dp[i - 2] return dp[n] 279.完全平方数…

spring状态机实战

一、什么是状态机 状态机是有限状态自动机的简称&#xff0c;是现实事物运行规则抽象而成的一个数学模型&#xff0c;是一种概念性机器&#xff0c;它能采取某种操作来响应一个外部事件。这种操作不仅能取决于接收到的事件&#xff0c;还能取决于各个事件的相对发生顺序。状态…