Stream的概念与操作:高效的数据处理方式!
【摘要】 开篇语哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。 我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,...
开篇语
哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!
前序
在Java 8中,引入了Stream API,旨在以声明式的方式简化数据处理。Stream使得处理集合数据变得更加简洁、高效、可读性更强,并支持函数式编程风格。通过Stream,我们可以轻松地进行过滤、排序、映射、聚合等常见的集合操作,并且支持并行计算,提高程序的执行效率。
今天,我们将深入探讨Stream的概念、基本操作以及如何高效地使用Stream API处理数据。
前言
随着Java 8引入的Stream API,处理集合数据不再需要写繁琐的迭代代码,Stream通过管道化的方式(Pipeline)允许你以声明性方式操作数据。这种方式不仅简化了代码,还使得程序在处理大量数据时能更高效地进行操作(尤其是并行处理)。我们将通过实例来展示如何使用Stream进行常见的集合操作,如过滤、映射、排序、聚合等。
第一部分:Stream的基本概念
1.1 什么是Stream?
Stream 是对集合的抽象,它代表了一种可以按需执行的元素序列(例如集合、数组等)。Stream API提供了一种高效的方式来处理数据,可以将数据操作链式连接,简化代码的复杂度。
Stream并不存储数据,它仅仅是描述数据操作的过程。因此,Stream操作分为两种类型:
- 中间操作(Intermediate Operations):这些操作返回一个Stream本身,允许链式调用。常见的中间操作包括
filter
、map
、distinct
、sorted
等。 - 终止操作(Terminal Operations):这些操作会产生一个结果,或者对Stream进行遍历,或者将其收集到集合中。常见的终止操作包括
forEach
、collect
、reduce
等。
1.2 Stream的特点
- 惰性计算(Lazy Evaluation):Stream的操作是惰性计算的,这意味着Stream的中间操作在调用终止操作之前不会被执行。这使得Stream能够优化计算(例如惰性加载、短路等)。
- 无状态操作:Stream的中间操作不改变源数据结构,只是对数据的视图进行操作。
- 可以并行处理:Stream支持并行流(
parallelStream()
),这允许我们利用多核CPU并行处理数据,提高性能。
第二部分:常见的Stream操作
2.1 创建Stream
Stream可以从多种数据源创建,例如集合、数组等。
从集合创建Stream
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class StreamExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("Apple", "Banana", "Cherry", "Date");
// 使用Stream.of()直接创建Stream
Stream<String> stream1 = Stream.of("Apple", "Banana", "Cherry", "Date");
// 使用集合的stream()方法创建Stream
Stream<String> stream2 = list.stream();
stream2.forEach(System.out::println);
}
}
从数组创建Stream
public class StreamExample {
public static void main(String[] args) {
String[] array = {"Apple", "Banana", "Cherry", "Date"};
// 使用Arrays.stream()方法创建Stream
Stream<String> stream = Arrays.stream(array);
stream.forEach(System.out::println);
}
}
2.2 中间操作:filter()
、map()
、distinct()
、sorted()
2.2.1 filter()
:过滤操作
filter()
中间操作用于筛选符合特定条件的元素。
示例:
import java.util.Arrays;
import java.util.List;
public class StreamExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("Apple", "Banana", "Cherry", "Date");
// 过滤出长度大于5的水果名
list.stream()
.filter(fruit -> fruit.length() > 5)
.forEach(System.out::println); // 输出:Banana, Cherry
}
}
2.2.2 map()
:映射操作
map()
中间操作用于将Stream中的每个元素映射成一个新元素,通常用于转换数据类型或内容。
示例:
import java.util.Arrays;
import java.util.List;
public class StreamExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("apple", "banana", "cherry");
// 将所有水果名转换为大写
list.stream()
.map(String::toUpperCase)
.forEach(System.out::println); // 输出:APPLE, BANANA, CHERRY
}
}
2.2.3 distinct()
:去重操作
distinct()
中间操作用于去除Stream中的重复元素。
示例:
import java.util.Arrays;
import java.util.List;
public class StreamExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("apple", "banana", "apple", "cherry");
// 去重
list.stream()
.distinct()
.forEach(System.out::println); // 输出:apple, banana, cherry
}
}
2.2.4 sorted()
:排序操作
sorted()
中间操作用于对Stream中的元素进行排序。它默认按照元素的自然顺序进行排序。
示例:
import java.util.Arrays;
import java.util.List;
public class StreamExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("apple", "banana", "cherry", "date");
// 排序
list.stream()
.sorted()
.forEach(System.out::println); // 输出:apple, banana, cherry, date
}
}
如果需要自定义排序规则,可以使用sorted(Comparator)
。
2.3 终止操作:forEach()
、collect()
、reduce()
2.3.1 forEach()
:遍历操作
forEach()
终止操作用于遍历Stream中的每个元素,并对其执行某些操作。
示例:
import java.util.Arrays;
import java.util.List;
public class StreamExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("apple", "banana", "cherry");
// 遍历并打印每个元素
list.stream()
.forEach(System.out::println); // 输出:apple, banana, cherry
}
}
2.3.2 collect()
:收集操作
collect()
终止操作用于将Stream的元素收集到一个集合中,最常用的是收集到List
、Set
、Map
等。
示例:
import java.util.*;
import java.util.stream.Collectors;
public class StreamExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("apple", "banana", "cherry");
// 将Stream的元素收集到一个List中
List<String> result = list.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(result); // 输出:[APPLE, BANANA, CHERRY]
}
}
2.3.3 reduce()
:归约操作
reduce()
终止操作用于将Stream中的元素反复结合起来,最终得到一个值。它通常用于求和、求最小值、最大值等操作。
示例:
import java.util.Arrays;
import java.util.List;
public class StreamExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// 求和
int sum = numbers.stream()
.reduce(0, (a, b) -> a + b);
System.out.println("Sum: " + sum); // 输出:Sum: 15
}
}
解释:
reduce(0, (a, b) -> a + b)
:初始值为0,将Stream中的元素依次相加。
第三部分:并行流(Parallel Stream)
3.1 什么是并行流?
并行流(Parallel Stream)是Stream的一种扩展,允许在多个线程中并行地处理数据,利用多核CPU提高计算效率。
3.2 创建并行流
可以通过parallelStream()
方法将Stream转为并行流。
示例:
import java.util.Arrays;
import java.util.List;
public class ParallelStreamExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// 使用并行流处理数据
numbers.parallelStream()
.forEach(System.out::println);
}
}
解释:
parallelStream()
方法会将数据并行处理,从而加速计算过程。
3.3 并行流的优势与劣势
- 优势:利用多核CPU加速数据处理,适合处理大量数据。
- 劣势:在某些场景下,并行流可能会比串行流更慢,尤其是数据量较小或操作复杂时,线程切换的开销可能影响性能。
总结
Java的Stream API为我们提供了一种简洁而高效的数据处理方式。通过Stream,我们能够以声明式的方式进行过滤、映射、排序、聚合等操作,同时支持并行处理,极大地提高了代码的简洁性和运行效率。
通过掌握Stream的概念与常见操作,我们可以高效地处理集合数据,提高程序的性能和可维护性。希望你在实际开发中,能够灵活运用Stream,编写更加优雅和高效的Java代码。
… …
文末
好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。
… …
学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!
wished for you successed !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
版权声明:本文由作者原创,转载请注明出处,谢谢支持!
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)