Java Stream API 实战:提升集合处理的效率与可读性!
全文目录:
- 开篇语
- 前言
- 什么是Stream API?
- Stream的操作分为两种类型:
- 基本操作示例
- 1. 创建Stream
- 通过集合创建Stream
- 通过数组创建Stream
- 2. 中间操作
- 过滤操作:`filter()`
- 映射操作:`map()`
- 排序操作:`sorted()`
- 去重操作:`distinct()`
- 3. 终端操作
- 收集操作:`collect()`
- 遍历操作:`forEach()`
- 聚合操作:`reduce()`
- 计数操作:`count()`
- 4. 并行流(Parallel Stream)
- 5. 组合Stream操作
- 总结
- 文末
开篇语
哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!
前言
随着Java 8的发布,Stream API成为了处理集合数据的一个强大工具。Stream API允许我们以声明式的方式处理数据流(如集合、数组等),并使得代码更加简洁和易读。Stream API的引入大大简化了集合的操作,尤其是在需要进行复杂数据处理时,能够提高效率和可维护性。
本文将通过一系列实际例子,帮助大家深入理解如何在Java中使用Stream API,提升开发效率和代码质量。
什么是Stream API?
Stream
是Java 8引入的一个新特性,它代表了数据的“流”,能够对集合类进行高效的操作,支持多核架构下的并行处理。通过Stream API,我们可以进行诸如过滤、映射、排序、统计等操作,而这些操作都可以通过函数式编程的方式来实现。
Stream的操作分为两种类型:
- 中间操作(Intermediate Operations):返回一个新的Stream对象,操作是懒加载的,只有在终端操作执行时才会触发。
- 终端操作(Terminal Operations):执行某种操作并生成结果,触发流的处理过程。常见的终端操作有
collect()
、forEach()
、reduce()
等。
基本操作示例
1. 创建Stream
Stream可以从集合、数组或其他数据源中生成。下面我们通过几个简单的例子来展示如何创建Stream。
通过集合创建Stream
import java.util.*;
import java.util.stream.*;public class StreamCreationExample {public static void main(String[] args) {List<String> list = Arrays.asList("Apple", "Banana", "Cherry", "Date");Stream<String> stream = list.stream();stream.forEach(System.out::println); // 打印所有元素}
}
通过数组创建Stream
public class StreamCreationExample {public static void main(String[] args) {int[] numbers = {1, 2, 3, 4, 5};IntStream stream = Arrays.stream(numbers);stream.forEach(System.out::println); // 打印所有数字}
}
2. 中间操作
Stream的中间操作通常会返回一个新的Stream,常见的中间操作有:filter()
、map()
、sorted()
、distinct()
等。
过滤操作:filter()
filter()
方法用于根据给定的条件筛选流中的元素。
public class FilterExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);numbers.stream().filter(n -> n % 2 == 0) // 过滤出所有偶数.forEach(System.out::println);}
}
映射操作:map()
map()
方法用于将每个元素通过给定的函数转换为另一个元素。
public class MapExample {public static void main(String[] args) {List<String> list = Arrays.asList("apple", "banana", "cherry");list.stream().map(String::toUpperCase) // 转换为大写字母.forEach(System.out::println);}
}
排序操作:sorted()
sorted()
方法用于对Stream中的元素进行排序。
public class SortedExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(5, 2, 9, 1, 4, 8);numbers.stream().sorted().forEach(System.out::println); // 默认升序排序}
}
去重操作:distinct()
distinct()
方法用于移除流中的重复元素。
public class DistinctExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4, 5);numbers.stream().distinct() // 去重.forEach(System.out::println);}
}
3. 终端操作
Stream的终端操作触发实际的计算并返回结果。常见的终端操作有:collect()
、forEach()
、reduce()
、count()
等。
收集操作:collect()
collect()
方法是最常用的终端操作之一,用于将Stream的元素收集到集合中。
import java.util.*;
import java.util.stream.*;public class CollectExample {public static void main(String[] args) {List<String> list = Arrays.asList("apple", "banana", "cherry", "date");List<String> result = list.stream().filter(s -> s.startsWith("a")).collect(Collectors.toList()); // 将结果收集到List中System.out.println(result);}
}
遍历操作:forEach()
forEach()
方法用于遍历Stream中的元素。
public class ForEachExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);numbers.stream().forEach(System.out::println); // 打印每个数字}
}
聚合操作:reduce()
reduce()
方法用于将Stream中的元素按照某种方式进行聚合,常用于求和、求最大值等操作。
public class ReduceExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);Optional<Integer> sum = numbers.stream().reduce((a, b) -> a + b); // 求和sum.ifPresent(System.out::println); // 输出结果}
}
计数操作:count()
count()
方法用于统计Stream中元素的数量。
public class CountExample {public static void main(String[] args) {List<String> list = Arrays.asList("apple", "banana", "cherry", "date");long count = list.stream().filter(s -> s.startsWith("a")).count(); // 统计以字母"a"开头的元素个数System.out.println(count);}
}
4. 并行流(Parallel Stream)
Stream API还支持并行处理数据,通过并行流可以加速大规模数据的处理。使用parallelStream()
方法可以将Stream转为并行流。
public class ParallelStreamExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);numbers.parallelStream().forEach(n -> System.out.println(Thread.currentThread().getName() + ": " + n));}
}
5. 组合Stream操作
Stream的强大之处在于我们可以将多个操作组合起来,形成一个流水线式的处理流。
public class CombinedOperationsExample {public static void main(String[] args) {List<String> list = Arrays.asList("apple", "banana", "cherry", "date");list.stream().filter(s -> s.length() > 5) // 过滤长度大于5的字符串.map(String::toUpperCase) // 转换为大写.sorted() // 排序.forEach(System.out::println); // 打印结果}
}
总结
Java Stream API为集合操作提供了一个简洁且功能强大的解决方案。通过使用Stream API,我们能够:
- 以声明式的方式处理集合数据,提高代码的可读性。
- 支持函数式编程和链式操作,使代码更简洁。
- 实现高效的并行处理,提升性能。
Stream API不仅使得代码更加简洁,而且让我们能够利用现代多核处理器的优势,显著提高程序处理大数据的效率。在实际项目中,掌握Stream API将有助于提高代码质量和开发效率。
… …
文末
好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。
… …
学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!
wished for you successed !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
版权声明:本文由作者原创,转载请注明出处,谢谢支持!