java Stream流常用操作

文章目录

  • 1. 简介
    • 1.1 Stream流的概念
    • 1.2 为什么需要使用Stream流
  • 2. Stream流的创建
    • 2.1 从集合创建Stream
    • 2.2 从数组创建Stream
    • 2.3 使用Stream.of方法创建Stream
    • 2.4 使用IntStream, LongStream, DoubleStream创建Stream
  • 3. Stream流的常用操作
    • 3.1 filter操作
    • 3.2 map操作
    • 3.3 flatMap操作
    • 3.4 distinct操作
    • 3.5 limit操作
    • 3.6 skip操作
    • 3.7 sorted操作
  • 4. Stream流的终止操作
    • 4.1 forEach操作
    • 4.2 toArray操作
    • 4.3 reduce操作
    • 4.4 collect操作
    • 4.5 min, max, count, anyMatch, allMatch, noneMatch操作
    • 4.6 findFirst, findAny操作
  • 5. Stream流的并行处理
    • 5.1 并行流的概念
    • 5.2 创建并行流
    • 5.3 并行流的使用注意事项
  • 6.实战示例
    • 实例1:过滤和转换
    • 实例2:统计
    • 实例3:查找
    • 实例4:并行处理

1. 简介

1.1 Stream流的概念

在Java 8中,Stream流是一种新的数据处理方式。Stream流并不是数据结构,它不会改变源数据,你可以视为遍历数据的高级迭代器。此外,Stream流可以透明地并行处理,无需我们在代码中手动进行并行处理。

Stream流的操作可以分为两种:中间操作和终止操作。中间操作只对数据做标记,只有在遇到终止操作时才会进行实际的计算。

List<String> list = Arrays.asList("a", "b", "c");
list.stream().filter(s -> s.startsWith("a")).forEach(System.out::println);

在上面的代码中,filter是一个中间操作,forEach是一个终止操作。

1.2 为什么需要使用Stream流

在Java 8之前,我们通常使用for循环或者迭代器对集合进行操作。然而,这种方式需要我们显式地在集合上进行迭代,这不仅代码冗长,而且在处理复杂的数据转换和过滤时,代码的可读性和维护性都会下降。

而Stream流提供了一种更高级、更方便的处理方式。它允许我们以声明性的方式处理数据,我们只需要告诉计算机我们想要的结果是什么,而不需要告诉它具体的实现步骤。这使得我们的代码更简洁,更易于阅读和维护。

此外,Stream流的另一个重要特性是它可以透明地进行并行处理。这意味着我们可以充分利用多核处理器的优势,而无需在代码中手动进行多线程管理。

总的来说,使用Stream流可以让我们的代码更简洁,更易于阅读和维护,同时能提高程序的性能。

2. Stream流的创建

在Java 8中,我们可以通过多种方式创建Stream流。以下是一些常见的方法:

2.1 从集合创建Stream

每个Java集合都可以通过stream方法转换为Stream流。

List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();

2.2 从数组创建Stream

我们可以使用Arrays.stream方法从数组创建Stream流。

int[] array = {1, 2, 3, 4, 5};
IntStream stream = Arrays.stream(array);

2.3 使用Stream.of方法创建Stream

Stream.of方法可以接受任意数量的参数,并返回一个Stream流。

Stream<String> stream = Stream.of("a", "b", "c");

2.4 使用IntStream, LongStream, DoubleStream创建Stream

Java 8引入了几种特殊的Stream流,用于处理基本数据类型的值,如IntStreamLongStreamDoubleStream。这些特殊的Stream流提供了一些额外的方法,如sumaverage等。

IntStream stream = IntStream.range(1, 5);

以上就是在Java 8中创建Stream流的一些常见方法。

3. Stream流的常用操作

在Java 8中,Stream流提供了一系列的操作,可以帮助我们更方便地处理数据。以下是一些常用的操作:

3.1 filter操作

filter操作用于过滤Stream流中的元素。它接受一个Predicate接口类型的参数,只有满足该条件的元素才能获取。

List<String> list = Arrays.asList("a", "b", "c", "d", "e");
list.stream().filter(s -> s.startsWith("a")).forEach(System.out::println);

3.2 map操作

map操作用于转换Stream流中的元素。它接受一个Function接口类型的参数,通过这个函数,我们可以将元素转换成其他类型。

List<String> list = Arrays.asList("a", "b", "c", "d", "e");
list.stream().map(String::toUpperCase).forEach(System.out::println);

3.3 flatMap操作

flatMap操作用于将Stream流中的每个元素转换成另一个Stream流,然后将所有的Stream流连接成一个Stream流。

List<String> list = Arrays.asList("a", "b", "c", "d", "e");
list.stream().flatMap(s -> Stream.of(s.toUpperCase(), s.toLowerCase())).forEach(System.out::println);

3.4 distinct操作

distinct操作用于去除Stream流中的重复元素。

List<String> list = Arrays.asList("a", "b", "c", "a", "b");
list.stream().distinct().forEach(System.out::println);

3.5 limit操作

limit操作用于获取Stream流中的前n个元素。

List<String> list = Arrays.asList("a", "b", "c", "d", "e");
list.stream().limit(3).forEach(System.out::println);

3.6 skip操作

skip操作用于跳过Stream流中的前n个元素。

List<String> list = Arrays.asList("a", "b", "c", "d", "e");
list.stream().skip(2).forEach(System.out::println);

3.7 sorted操作

sorted操作用于对Stream流中的元素进行排序。它有两种形式:一种是使用自然顺序排序,另一种是使用自定义比较器排序。

List<String> list = Arrays.asList("a", "c", "b", "d", "e");
list.stream().sorted().forEach(System.out::println);

以上就是Java 8中Stream流的一些常用操作。

4. Stream流的终止操作

在Java 8中,Stream流的操作可以分为中间操作和终止操作。中间操作只对数据进行处理,但不会消费Stream流,而终止操作会消费Stream流,并产生一个结果或者一个副作用。以下是一些常用的终止操作:

4.1 forEach操作

forEach操作用于对Stream流中的每个元素执行一个操作。这是一个终止操作,所以它会消费Stream流。

List<String> list = Arrays.asList("a", "b", "c");
list.stream().forEach(System.out::println);

4.2 toArray操作

toArray操作用于将Stream流转换为数组。

List<String> list = Arrays.asList("a", "b", "c");
String[] array = list.stream().toArray(String[]::new);

4.3 reduce操作

reduce操作用于将Stream流中的元素通过一个二元函数进行累积操作,从而将Stream流减少为一个单一的结果。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> sum = list.stream().reduce(Integer::sum);

4.4 collect操作

collect操作用于将Stream流转换为其他形式的结果,如List、Set或Map。

List<String> list = Arrays.asList("a", "b", "c");
List<String> newList = list.stream().collect(Collectors.toList());

4.5 min, max, count, anyMatch, allMatch, noneMatch操作

这些操作用于对Stream流中的元素进行统计。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> min = list.stream().min(Integer::compareTo);
Optional<Integer> max = list.stream().max(Integer::compareTo);
long count = list.stream().count();
boolean anyMatch = list.stream().anyMatch(i -> i > 3);
boolean allMatch = list.stream().allMatch(i -> i > 0);
boolean noneMatch = list.stream().noneMatch(i -> i < 0);

4.6 findFirst, findAny操作

这些操作用于获取Stream流中的某个元素。

List<String> list = Arrays.asList("a", "b", "c");
Optional<String> first = list.stream().findFirst();
Optional<String> any = list.stream().findAny();

以上就是Java 8中Stream流的一些常用终止操作。

5. Stream流的并行处理

在Java 8中,Stream API支持并行处理,这是一种利用多核处理器的能力来加速计算的技术。

5.1 并行流的概念

并行流就是一个把内容分成多个数据块,并用不同的线程分别处理每个数据块的流。Java 8的并行流就是把一个数据内容分成多个数据块,并用多个线程处理的流。这样可以充分利用多核处理器的优势,使得程序在进行大数据量处理时能更快地得到结果。

5.2 创建并行流

创建并行流有两种方式:

  1. 使用 parallelStream 方法:
List<String> list = Arrays.asList("a", "b", "c", "d", "e");
Stream<String> parallelStream = list.parallelStream();
  1. 使用 parallel 方法:
List<String> list = Arrays.asList("a", "b", "c", "d", "e");
Stream<String> parallelStream = list.stream().parallel();

5.3 并行流的使用注意事项

虽然并行流可以提高处理速度,但并不是所有情况下都适用,并且并行流的使用也需要注意以下几点:

  1. 任务的性质:如果任务之间有大量的数据依赖性,那么并行流可能带来的性能提升就会大打折扣。

  2. 数据量的大小:只有在数据量足够大的情况下,使用并行流才能体现出性能优势。对于小数据量的处理,串行流可能更快。

  3. 并行处理可能引发的问题:并行处理可能会引发线程安全问题,需要确保操作是线程安全的。

  4. 并行流和顺序流的切换:并行流和顺序流可以相互切换。使用 parallel 方法可以将顺序流转换为并行流,使用 sequential 方法可以将并行流转换为顺序流。

  5. 注意避免线程阻塞:如果流中的某些操作可能会阻塞线程,如网络IO操作,那么使用并行流可能会导致程序性能下降,甚至发生死锁。

以上就是Java 8中Stream流并行处理的一些基本概念和使用注意事项。

以下是一些使用Java 8 Stream流进行数据处理的实例:

6.实战示例

实例1:过滤和转换

假设我们有一个用户列表,我们想要找出年龄大于18岁的用户,并将他们的用户名转换为大写。

public class User {private String username;private int age;// getters and setters
}List<User> users = ... // 获取用户列表List<String> usernames = users.stream().filter(user -> user.getAge() > 18).map(User::getUsername).map(String::toUpperCase).collect(Collectors.toList());

实例2:统计

假设我们想要统计用户列表中年龄大于18岁的用户数量。

long count = users.stream().filter(user -> user.getAge() > 18).count();

实例3:查找

假设我们想要找到年龄最大的用户。

Optional<User> oldestUser = users.stream().max(Comparator.comparingInt(User::getAge));

实例4:并行处理

假设我们有一个非常大的用户列表,我们想要并行地处理这个列表,找出年龄大于18岁的用户,并将他们的用户名转换为大写。

List<String> usernames = users.parallelStream().filter(user -> user.getAge() > 18).map(User::getUsername).map(String::toUpperCase).collect(Collectors.toList());

以上就是一些使用Java 8 Stream流进行数据处理的实例。通过这些实例,我们可以看到Stream流提供了一种声明式的方式来处理数据,使得代码更加清晰和简洁。

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

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

相关文章

设计模式六大原则之迪米特法则

文章目录 概念个人理解案例 小结 概念 迪米特法则指的是一个类/模块对其他的类/模块有越少的了解越好。 简单来说迪米特发展想要表达的思想就是&#xff1a;不应该有直接依赖关系的类之间&#xff0c;不要有依赖&#xff1b;有依赖关系的类之间&#xff0c;尽量只依赖必要的接…

windows中每日定时执行python脚本,解决问题

由于需要一个每天定时执行的任务&#xff0c;所以需要定时启动&#xff0c;网上看了很多方法&#xff0c;感觉不能在python脚本种写个while true 定时执行&#xff0c;占资源不说还不可靠。 最后考虑通过系统工具定时启动&#xff0c;发现linux中有crontab&#xff0c;windows…

前端 CSS 经典:水波进度样式

前言&#xff1a;简单实现水波进度样式&#xff0c;简单好看。 效果图&#xff1a; 代码实现&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8" /><meta http-equiv"X-UA-Compatible" cont…

git:Unable to negotiate问题解决

场景说明&#xff1a; 安装了Gitblit(自架的代码仓库服务)发现部分电脑无法推代码&#xff0c;报错误如下&#xff1a; Unable to negotiate with **** port 22: no matching host key type found. Their offer: ssh-rsa 并排队了账户权限问题。 解决方案&#xff1a; 1.打开问…

计算机原理 知识回顾

第一部分&#xff1a;计算机基础概念 计算机的定义 计算机的演化历程计算机的分类&#xff08;超级计算机、桌面计算机、便携式计算机等&#xff09; 计算机的基本组成 输入设备、输出设备中央处理单元&#xff08;CPU&#xff09;、存储器、主板 计算机的工作原理 数据输…

5.28 学习总结

一.CSS学习(一) 一、CSS简介 1、什么是CSS CSS&#xff1a;Cascading Style Sheet 层叠样式表是一组样式设置的规则&#xff0c;用于控制页面的外观样式 2、为什么使用CSS 实现内容与样式的分离&#xff0c;便于团队开发样式复用&#xff0c;便于网站的后期维护页面的精确…

uniapp sqlite数据库插件

uniapp 原生sqlite本地数据库管理 Ba-Sqlite_sqlite_三杯五岳-华为云开发者联盟

iptables练习题

目录 练习题1. 显示当前的iptables规则2. 允许所有来自192.168.1.0/24的TCP流量到本机的22端口&#xff08;SSH&#xff09;3. 禁止所有来自10.0.0.0/8的ICMP流量4. 允许所有出站流量5. 拒绝所有来自外部的HTTP流量&#xff08;80端口&#xff0c;tcp协议&#xff09;6. 删除IN…

数据恢复与取证软件: WinHex 与 X-Ways Forensics 不同许可证功能区别

天津鸿萌科贸发展有限公司从事数据安全业务20余年&#xff0c;在数据恢复、数据取证、数据备份等领域有丰富的案例经验、专业技术及良好的行业口碑。同时&#xff0c;公司面向取证机构及数据恢复公司&#xff0c;提供数据恢复实验室建设方案&#xff0c;包含数据恢复硬件设备及…

期货学习笔记-斐波那契学习1

斐波那契数列介绍 斐波那契数列是1、1、2、3、5、8、13、21、34、55、89…据说这是数学家莱昂纳多 斐波那契研究兔子繁殖时发现的一个神奇数列&#xff0c;似乎大自然在按照这个数列进行演化&#xff0c;一个斐波那契数字是由该数列相邻的前两个数字相加得到的 在斐波那契交易…

oracle 核心进程

DBWn&#xff08;Database Writer&#xff09;&#xff1a;负责将数据库缓冲区中的数据写回磁盘&#xff0c;以保证数据的持久性。 LGWR&#xff08;Log Writer&#xff09;&#xff1a;负责将日志缓冲区中的日志写入到磁盘上的在线重做日志文件&#xff0c;用于数据库的恢复和…

基于STM32实现智能交通灯控制系统

目录 引言环境准备智能交通灯控制系统基础代码示例&#xff1a;实现智能交通灯控制系统 GPIO控制交通灯定时器配置与使用红外传感器检测车辆用户界面与显示应用场景&#xff1a;城市交通管理与自动化控制问题解决方案与优化收尾与总结 1. 引言 本教程将详细介绍如何在STM32嵌…

【chatGPT API】Function Calling:将自然语言转换为API调用或数据库查询

文章目录 一. 介绍二. 常见用例与Function Calling调用逻辑三. 调用细节1. 调用行为&#xff1a;tool_choice2. 调用规定&#xff1a;functions 四. 实战&#xff1a;查询公司相关产品 一. 介绍 OpenAI可以根据用户的要求输出一个符合用户要求的入参值。然后用户拿到入参值之后…

14.Redis之JAVASpring客户端

1.引入依赖 此时就会引入操作 redis 的依赖了~~ 2.yml配置 spring:redis:host: 127.0.0.1port: 8888 3.准备 前面使用 jedis,是通过 Jedis 对象里的各种方法来操作 redis 的.此处Spring 中则是通过 StringRedisTemplate 来操作 redis .最原始提供的类是 RedisTemplateStrin…

LeetCode 每日一题 数学篇(2769.找出最大的可达成数字)

给你两个整数 num 和 t 。 如果整数 x 可以在执行下述操作不超过 t 次的情况下变为与 num 相等&#xff0c;则称其为 可达成数字 &#xff1a; 每次操作将 x 的值增加或减少 1 &#xff0c;同时可以选择将 num 的值增加或减少 1 。 返回所有可达成数字中的最大值。可以证明至…

洛谷 P1346电车

题目来源于&#xff1a;洛谷 解题思路&#xff1a; 可以把一个路口看作一张图中的一个点&#xff0c;轨道是图中的边&#xff08;注意&#xff1a;这是有向图&#xff09;&#xff0c;每一条边的权值就是这个边所联通的点是否需要按按钮&#xff08;需要按按钮就是1&#xff0…

关于NLTK

一、NLTK简介 下图来自NLTK官网&#xff1a;https://www.nltk.org/index.html NLTK&#xff0c;全称为Natural Language Toolkit&#xff0c;是一个用于处理和分析自然语言文本的Python库。它提供了一系列丰富的工具和资源&#xff0c;包括词汇资源&#xff08;如WordNet&am…

蓝桥楼赛第30期-Python-第三天赛题 提取电影信息题解

楼赛 第30期 Python 模块大比拼 提取电影信息 介绍 JSON&#xff08;JavaScript Object Notation, /ˈdʒeɪsən/&#xff09;是一种轻量级的数据交换格式&#xff0c;最初是作为 JavaScript 的子集被发明的&#xff0c;但目前已独立于编程语言之外&#xff0c;成为了通用的…

常见开源蜜罐系统

蜜罐系统&#xff08;Honeypot&#xff09;在信息安全领域中是一种被广泛使用的技术&#xff0c;旨在吸引和诱导黑客入侵&#xff0c;从而获取和分析攻击者的行为和手段。以下是一些常见的蜜罐系统的介绍&#xff1a; HFish开源蜜罐系统 特点&#xff1a; 多功能&#xff1a;支…

Scrapy框架简单介绍及Scrapy项目编写详细步骤(Scrapy框架爬取豆瓣网站示例)

引言 Scrapy是一个用Python编写的开源、功能强大的网络爬虫框架&#xff0c;专为网页抓取和数据提取设计。它允许开发者高效地从网站上抓取所需的数据&#xff0c;并通过一系列可扩展和可配置的组件来处理这些数据。Scrapy框架的核心组成部分包括&#xff1a; Scrapy Engine&…