Java中stream是什么及如何使用
在Java中,Stream(流)是一种用于操作集合(Collection)、数组等数据源的API。它提供了一种功能强大且表达力高的编程模型,可以用更简洁、更具可读性的方式处理数据。
Stream的主要作用是进行数据的转换、筛选、聚合等操作,可以极大地简化对数据的处理。使用Stream可以避免显式地使用迭代器或循环来操作集合,提高代码的可读性和简洁性。
以下是使用Stream的一般步骤:
获取一个数据源(如List、Set、数组等)。
调用stream()方法获取数据流。
使用各种中间操作对数据流进行处理(如筛选、转换等)。
调用终端操作执行对数据流的最终处理(如聚合、收集结果等)。
下面通过示例代码详细介绍Stream的使用:
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class StreamExample { public static void main(String[] args) { // 1. 获取数据源 Listnumbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // 2. 获取数据流 List evenSquares = numbers.stream() // 3. 中间操作:筛选偶数并计算平方 .filter(n -> n % 2 == 0) .map(n -> n * n) // 4. 终端操作:收集结果 .collect(Collectors.toList()); System.out.println(evenSquares); // 输出:[4, 16, 36, 64, 100] } }
在上述示例中,我们首先获取了一个整数列表作为数据源。然后,通过调用stream()方法获取了一个数据流。接着,使用中间操作filter()筛选出偶数,再使用map()计算平方。最后,通过终端操作collect()将结果收集到列表中。
这只是Stream的基本用法,Stream还提供了丰富的中间操作和终端操作供使用,如sorted()、distinct()、reduce()等。通过组合不同的操作,可以实现复杂的数据处理逻辑。
stream用法:
filter(Predicate
Listlist = Arrays.asList(1, 2, 3, 4, 5); List result = list.stream().filter(n -> n % 2 == 0).collect(Collectors.toList()); // 输出:[2, 4]
flatMap(Function
List> lists = Arrays.asList(Arrays.asList(1, 2), Arrays.asList(3, 4, 5)); List
result = lists.stream().flatMap(list -> list.stream()).collect(Collectors.toList()); // 输出:[1, 2, 3, 4, 5]
distinct():去除流中重复的元素。
Listlist = Arrays.asList(1, 2, 3, 2, 4, 1, 5); List result = list.stream().distinct().collect(Collectors.toList()); // 输出:[1, 2, 3, 4, 5]
sorted():对流中元素进行排序。
Listlist = Arrays.asList(5, 3, 1, 2, 4); List result = list.stream().sorted().collect(Collectors.toList()); // 输出:[1, 2, 3, 4, 5]
peek(Consumer
Listlist = Arrays.asList(1, 2, 3, 4, 5); List result = list.stream().peek(n -> System.out.println("Processing element: " + n)).collect(Collectors.toList()); // 输出:Processing element: 1 Processing element: 2 Processing element: 3 Processing element: 4 Processing element: 5
limit(long maxSize):截取流中的前N个元素。
Listlist = Arrays.asList(1, 2, 3, 4, 5); List result = list.stream().limit(3).collect(Collectors.toList()); // 输出:[1, 2, 3]
skip(long n):跳过流中的前N个元素。
Listlist = Arrays.asList(1, 2, 3, 4, 5); List result = list.stream().skip(3).collect(Collectors.toList()); // 输出:[4, 5]
1.forEach(Consumer
Listlist = Arrays.asList(1, 2, 3, 4, 5); list.stream().forEach(n -> System.out.println(n)); // 输出:1 2 3 4 5
2.collect(Collector
Listlist = Arrays.asList(1, 2, 3, 4, 5); List result = list.stream().filter(n -> n % 2 == 0).collect(Collectors.toList()); // 输出:[2, 4]
3.count():返回流中的元素个数。
Listlist = Arrays.asList(1, 2, 3, 4, 5); long count = list.stream().count(); // 输出:5
4.reduce(T identity, BinaryOperator
Listlist = Arrays.asList(1, 2, 3, 4, 5); int sum = list.stream().reduce(0, (a, b) -> a + b); // 输出:15
5.findFirst()和findAny():返回流中的第一个元素或任意一个元素。
Listlist = Arrays.asList(1, 2, 3, 4, 5); Optional first = list.stream().findFirst(); Optional any = list.stream().findAny(); // 输出:1
6.max()和min():返回流中的最大元素或最小元素。
Listlist = Arrays.asList(1, 2, 3, 4, 5); Optional max = list.stream().max(Integer::compareTo); Optional min = list.stream().min(Integer::compareTo); // 输出:5 1
7.allMatch(Predicate
Listlist = Arrays.asList(1, 2, 3, 4, 5); boolean allMatch = list.stream().allMatch(n -> n > 0); boolean anyMatch = list.stream().anyMatch(n -> n % 2 == 0); boolean noneMatch = list.stream().noneMatch(n -> n > 5); // 输出:true true false
Stream是Java 8引入的一组 API,它提供了一种新的并行处理集合数据的方式,可以让开发者更加方便、高效地对集合进行操作。
Stream 是基于管道(Pipe)和过滤器(Filter)的模式,通过对数据源执行一系列中间操作(Intermediate Operations)和终端操作(Terminal Operations)来完成对数据的处理。
利用 Stream API,我们可以在不改变原有数据结构的前提下,方便地进行数据的筛选、排序、映射、聚合等操作,并且这些操作可以串行或并行地执行,以提高计算效率。
Stream流用途:
简化集合操作:Stream提供了丰富的中间操作和终端操作,可以更简洁地对集合进行筛选、转换、排序等操作,避免了使用传统的for循环等繁琐的操作。
并行处理:Stream API天然支持并行处理,可以自动将集合数据分成多个部分并行处理,提高处理的效率。
减少内存消耗:Stream API采用惰性求值的方式,在处理大量数据时可以只在需要时才进行计算,避免了一次性加载所有数据到内存中。
代码简洁、可读性好:Stream的链式调用和函数式编程风格使代码更加简洁、易读。每个操作都可以看作是对数据流的一次转换或处理,使得代码更加直观。
支持无限大的数据集:Stream API对于无限大的数据集也能处理,并且可以利用短路特性进行优化。
与Lambda表达式结合:Stream API广泛使用Lambda表达式,可以简化代码,提高开发效率。