java爽看Stream

Java Stream MD笔记

一、Java Stream概念

Java Stream是Java 8引入的一种新的数据处理方式,提供了一种高效、便利的方法来处理集合数据。Stream流可以让开发人员以声明式的方式对数据进行操作,从而使代码更加简洁、易读。Stream本身不存储数据,而是通过管道传输数据,支持类似于SQL语句的操作,如过滤、映射、排序等。

二、Stream的特点

1. **不存储数据**:Stream操作是延迟执行的,只有在终端操作时才会触发实际的计算。
2. **不可变性**:Stream操作不会改变源对象,而是返回一个新的Stream。
3. **支持并行操作**:通过`parallelStream()`方法,可以将流转换为并行流,利用多核处理器提高处理性能。
4. **操作多样性**:提供了丰富的中间操作和终端操作,如`filter()`, `map()`, `sorted()`, `collect()`等。

三、Stream的创建

1. 通过集合创建

List<Integer> list = Arrays.asList(5, 2, 3, 1, 4);
Stream<Integer> stream = list.stream();

2. 通过数组创建

String[] array = {"ab", "abc", "abcd", "abcde", "abcdef"};
Stream<String> stream = Arrays.stream(array);

3. 使用Stream静态方法

Stream<String> stream = Stream.of("ab", "abc", "abcd", "abcde", "abcdef");
Stream<Integer> stream2 = Stream.iterate(0, x -> x + 3).limit(5);
Stream<Integer> stream3 = Stream.generate(() -> new Random().nextInt()).limit(3);

4. 通过IntStream、LongStream、DoubleStream接口

IntStream intStream = IntStream.of(1, 2, 3, 4, 5);
IntStream range = IntStream.range(1, 5);
IntStream rangeClosed = IntStream.rangeClosed(1, 5);

四、Stream的中间操作

1. 过滤(filter)

Stream<String> stringStream = Stream.of("111", "22", "33333", "4444", "5555555", "111");
Stream<String> filteredStream = stringStream.filter(o -> o.length() < 3);

2. 截取(limit)

Stream<String> limitedStream = stringStream.limit(2);

3. 跳过(skip)

Stream<String> skippedStream = stringStream.skip(2).limit(2);

4. 去重(distinct)

Stream<String> distinctStream = stringStream.distinct();

5. 排序(sorted)

Stream<String> sortedStream = stringStream.sorted((o1, o2) -> o2.length() - o1.length());

6. 映射(map)

Stream<Integer> mappedStream = stringStream.map(Integer::parseInt);

五、Stream的终端操作

1. 最小值(min)和最大值(max)

Optional<Integer> min = mappedStream.distinct().min(Integer::compare);
Optional<Integer> max = mappedStream.distinct().max(Integer::compare);

2. 计数(count)

long count = stringStream.count();

3. 归约(reduce)

int sum = mappedStream.distinct().reduce(0, Integer::sum);

4. 收集(collect)

List<String> collectedList = stringStream.collect(Collectors.toList());

六、Stream的并行操作

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int parallelSum = numbers.parallelStream().reduce(0, Integer::sum);

七、Stream与集合的比较

  • 简洁性:Stream流以声明式的方式操作数据,代码更加简洁、易读。
  • 延迟执行:Stream流的操作是延迟执行的,提高了效率

当然,很高兴能够继续扩展这篇关于Java Stream的MD笔记。下面,我将增加一些高级话题和实际应用场景,以便更全面地了解Java Stream的强大功能。

八、Stream的高级特性

1. 条件性操作(peek)

peek方法是一个中间操作,它接收一个Consumer函数式接口作为参数,对Stream中的每个元素执行操作,但不影响Stream本身。主要用于调试或日志记录等场景。

Stream<String> stream = Stream.of("a", "bb", "ccc", "dddd");
stream.peek(System.out::println).filter(s -> s.length() > 1).forEach(System.out::println);
// 输出:
// a
// bb
// ccc
// dddd
// bb
// ccc
// dddd

注意:虽然peek可以输出元素,但上面的例子中,原始流中的"a"也被输出了,因为它在过滤之前就被处理了。

2. 自定义收集器(Collectors)

Java Stream API提供了Collectors类,用于实现各种终端操作,如收集到列表、集合、映射等。但你也可以通过Collectors.collectingAndThen()Collectors.toMap()等方法的重载版本,以及自定义Collector来实现更复杂的收集逻辑。

Map<Boolean, List<String>> partition = stream.collect(Collectors.partitioningBy(s -> s.length() > 2));// 自定义Collector示例
Collector<String, ?, String> joiningCollector = Collectors.collectingAndThen(Collectors.toList(),list -> String.join(",", list)
);
String joined = stream.collect(joiningCollector);

3. 扁平化流(flatMap)

当你有一个元素本身是流(或可以转换为流)的流时,flatMap方法非常有用。它将每个子流中的元素“扁平化”到主流中,从而得到一个包含所有子流元素的单一流。

List<List<String>> listOfLists = Arrays.asList(Arrays.asList("a", "b"),Arrays.asList("c", "d"),Arrays.asList("e")
);
Stream<String> flatStream = listOfLists.stream().flatMap(Collection::stream);
flatStream.forEach(System.out::println);
// 输出:
// a
// b
// c
// d
// e

九、Stream在实际应用中的案例

1. 文本处理

假设你有一个文件,包含多行文本,每行文本都是JSON格式的字符串。你可以使用Stream来读取文件,每行作为一个元素,然后解析JSON并处理数据。

Files.lines(Paths.get("data.txt")).map(jsonLine -> new ObjectMapper().readValue(jsonLine, MyObject.class)).forEach(obj -> processObject(obj));

2. 复杂的数据转换

当你需要从一组复杂对象中提取特定信息,并将这些信息转换为另一种格式时,Stream API提供了强大的支持。

List<ComplexObject> complexObjects = ...;
List<String> result = complexObjects.stream().map(obj -> obj.getNestedObject().getField()).filter(field -> !field.isEmpty()).collect(Collectors.toList());

3. 并发数据处理

Stream API支持并行流,可以利用多核处理器的优势来加速数据处理。但需要注意的是,并行流并不总是比顺序流更快,其性能取决于数据的特性和操作的复杂度。

IntStream.range(0, 1000).parallel().map(i -> complexCalculation(i)).sum();

十、注意事项和最佳实践

  1. 性能考量:并行流不总是比顺序流快,特别是在数据量不大或操作不复杂时。此外,并行流可能会引入额外的线程开销和竞争条件。

  2. 中间操作与终端操作:确保你的Stream链以终端操作结束,否则Stream将不会执行任何操作。

  3. 状态管理:在Stream操作中避免使用可变状态,因为这可能会导致不可预测的结果。

  4. 错误处理:Stream API中的错误处理通常是通过异常来实现的。确保你的代码能够妥善处理可能抛出的异常。

  5. 可读性:虽然Stream API可以使代码更简洁,但过度使用或不恰当的使用可能会降低代码的可读性。保持代码的清晰和易于理解是很重要的。

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

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

相关文章

怎么拼接几张图片为一张?拼接几张图片为一张的四种方法推荐

怎么拼接几张图片为一张&#xff1f;要将几张图片拼接成一张完整的图像&#xff0c;你可以利用现代软件和工具来实现这一操作。这种技术可以帮助你创建更大、更复杂的图像&#xff0c;无论是为了美学上的需要还是为了展示更完整的视觉信息。通过合并多张图片&#xff0c;你可以…

Windows上让Qt支持https请求

一.前言 Qt默认其实支持https的&#xff0c;但需要openssl的支持。所以有时候你代码中写了支持https的请求连接&#xff0c;发现程序可以运行&#xff0c;但到了https请求时会报错&#xff0c;如下&#xff1a; 这就是没有openssl的支持&#xff0c;导致QSslSocket无法进行ht…

利用customElements.define()设置自定义元素生成一个简单的对话框,且模版的css样式与外面的css样式相互不干扰

直接上代码 说明javascript代码直接嵌入在html里 <!DOCTYPE html> <html><head><meta http-equiv"content-type" content"text/html charsetutf-8"/><title>用影子DOM创建一个对话框</title><style>//这个对话…

关于c#的简单应用三题

#region 输入一个正整数&#xff0c;求1~这个数的阶乘 public static void Factorial(int a) { int result 1; for (int i 1; i < a; i) { result result * i; } Console.WriteLine(result); } #endregion #region 一个游戏&#…

【Vue3】从零开始编写项目

【Vue3】从零开始编写项目 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的…

Java Development Kit

JDK&#xff08;Java Development Kit&#xff09;是Java程序的软件开发工具包。JDK包含了Java的运行环境&#xff08;Java Runtime Environment&#xff0c;JRE&#xff09;以及Java工具和Java基础的类库。JDK的主要组成部分包括&#xff1a; JRE(Java Runtime Environment) …

阶梯-度小满春招算法方向第1批

问题的题面是典型的最长上升子序列问题。求方案数属动态规划问题&#xff0c;可推出以a[i]为最大节点的上升子序列方案数公式 dp[i]{dp[j] , 1<j<i-1&&f[j]1f[i]} &#xff08;f为最大上升子序列&#xff09;。 并且这个方案总数不会超过n&#xff0c;因此也…

C2W1.Assignment.Autocorrect.Part2

理论课&#xff1a;C2W1.Auto-correct 文章目录 3. Combining the edits3.1 Exercise 8.Edit one letter3.2 Exercise 9.Edit two letters3.3 Exercise 10.suggest spelling suggestions 4. Minimum Edit Distance4.1 Dynamic ProgrammingExercise 11Test All-in-one 5. Backt…

python项目中__init__.py是什么文件有什么作用

__init__.py 文件在 Python 项目中的作用主要是将目录标识为一个 Python 包。它在包的初始化过程中起到了重要作用。具体来说&#xff0c;__init__.py 文件有以下几个功能&#xff1a; 1.标识包&#xff1a; - 当一个目录中包含 __init__.py 文件时&#xff0c;这个目录就被视…

javaScrip的学习(一)

目录 引言 一、java和JavaScript的联系 二、js中的弹出框 1.alert弹出框 2.confirm带确认取消的按钮弹框 3.prompt带有提示信息且带有输入框的弹框 4.输出到网页中 ​三、js引入方式 1. 放在script标签中 2.放在外部js文件中 四、执行顺序 五、书写规范 1. 语句结…

python爬虫基础——Webbot库介绍

本文档面向对自动化网页交互、数据抓取和网络自动化任务感兴趣的Python开发者。无论你是初学者还是有经验的开发者&#xff0c;Webbot库都能为你的自动化项目提供强大的支持。 Webbot库概述 Webbot是一个专为Python设计的库&#xff0c;用于简化网页自动化任务。它基于Seleniu…

Hi3751V560_SELinux

Hi3751V560_SELinux setenforce Enforcing setenforce Permissive(或“setenforce 0”) getenforce V560:demo本身的: [ 13.765161] type=1400 audit(1628821512.905:4): avc: denied { read } for pid=1926 comm="system_server" name="ifindex" d…

CCRC-DCO数据合规入表正式落地!全流程操作指南来啦!(业内专家总结)

数据合规已绝非大企业专属&#xff01; 随着《网络安全法》《数据安全法》《个人信息保护法》相继落地&#xff0c;只要企业涉及用户的各种信息&#xff0c;哪怕是中小企业也会面临数据合规的监管&#xff0c;从而产生相关的法律需求。 小到APP对个人信息数据的采集&#xff0c…

[MY-013129] [Server]

日志 [MY-013129] [Server] A message intended for a client cannot be sent there as no client-session is attached. Therefore, we’re sending the information to the error-log instead: MY-001158 - Got an error reading communication packets 分析&#xff1a;如…

【深入C++】map和set的使用

文章目录 C 中的容器分类1. 顺序容器2. 关联容器3. 无序容器4. 容器适配器5. 字符串容器6. 特殊容器 set1.构造函数2.迭代器3.容量相关的成员函数4.修改器类的成员函数5.容器相关操作的成员函数 multiset1.equal_range map1.初始化相关的函数2.迭代器3.容量相关的成员函数4.访问…

LeetCode题(66,69,35,88)--《c++》

66.加一 // // Created by wxj05 on 2024/7/20. // //法一 class Solution { public:vector<int> plusOne(vector<int>& digits) {bool carry true; // 进位标志for (int i digits.size() - 1; i > 0 && carry; --i) {digits[i] 1;carry digit…

NAS:自动化设计目标检测模型的革命

标题&#xff1a;NAS&#xff1a;自动化设计目标检测模型的革命 随着人工智能技术的飞速发展&#xff0c;自动化机器学习&#xff08;AutoML&#xff09;已成为研究的热点之一。特别是在目标检测领域&#xff0c;自动化神经架构搜索&#xff08;NAS&#xff09;技术的应用&…

Ollama 如何让模型保持在内存或卸载

Ollama 默认情况下&#xff0c;模型会在内存中保存 5 分钟&#xff0c;然后才会卸载。如果您向 LLM 发出大量请求&#xff0c;这可以缩短响应时间。但是&#xff0c;您可能希望在 5 分钟过去之前释放内存&#xff0c;或者无限期地加载模型。使用参数keep_alive和/api/generateA…

AVL树的理解和实现[C++]

文章目录 AVL树AVL树的规则或原理 AVL树的实现1.节点的定义2.功能和接口等的实现默认构造函数&#xff0c;析构函数拷贝构造函数插入搜索打印函数检查是否为平衡树&#xff0c;检查平衡因子旋转 AVL树 AVL树&#xff0c;全称Adelson-Velsky和Landis树&#xff0c;是一种自平衡…

Java IO模型深入解析:BIO、NIO与AIO

Java IO模型深入解析&#xff1a;BIO、NIO与AIO 一. 前言 在Java编程中&#xff0c;IO&#xff08;Input/Output&#xff09;操作是不可或缺的一部分&#xff0c;它涉及到文件读写、网络通信等方面。Java提供了多种类和API来支持这些操作。本文将从IO的基础知识讲起&#xff…