系统学习链接https://blog.youkuaiyun.com/qq_36551991/article/details/108172160
Java的Stream API是Java 8引入的一项强大功能,用于处理集合数据。它允许以声明式编程的方式操作集合,大大简化了代码,提高了代码的可读性和可维护性。以下是对Java Stream的详细讲解:
什么是Stream?
Stream是数据的序列,支持多种操作来进行计算。它类似于集合,但不同之处在于,Stream的操作可以是惰性(lazy)的,这意味着它们会在需要时才进行计算,而不是立即计算。
Stream的特点
- 无存储:Stream不存储数据,而是按需计算。
- 函数式编程:Stream API利用函数式编程的思想,如lambda表达式,可以简洁地进行集合操作。
- 惰性执行:Stream操作是惰性的,只有在终端操作(terminal operation)执行时,才会进行计算。
- 可并行化:Stream API可以轻松地进行并行处理,提高性能。
创建Stream
有多种方式可以创建Stream:
-
通过集合创建:
List<String> list = Arrays.asList("a", "b", "c"); Stream<String> stream = list.stream();
-
通过数组创建:
String[] array = {"a", "b", "c"}; Stream<String> stream = Arrays.stream(array);
-
通过Stream的静态方法创建:
Stream<String> stream = Stream.of("a", "b", "c");
Stream的操作
Stream的操作分为两类:中间操作(intermediate operation)和终端操作(terminal operation)。
中间操作
中间操作会返回一个新的Stream,可以进行链式调用。常见的中间操作有:
-
filter:过滤元素
Stream<String> filtered = stream.filter(s -> s.startsWith("a"));
-
map:映射每个元素到另一个元素
Stream<Integer> mapped = stream.map(String::length);
-
sorted:排序
Stream<String> sorted = stream.sorted();
-
limit:限制Stream的长度
Stream<String> limited = stream.limit(2);
-
distinct:去重
Stream<String> distinct = stream.distinct();
终端操作
终端操作会触发Stream的计算,返回一个非Stream的结果,如集合或数值。常见的终端操作有:
-
forEach:遍历每个元素
stream.forEach(System.out::println);
-
collect:收集Stream的元素到集合
List<String> list = stream.collect(Collectors.toList());
-
reduce:通过给定的运算汇总元素
Optional<String> reduced = stream.reduce((s1, s2) -> s1 + s2);
-
count:计算元素个数
long count = stream.count();
-
anyMatch, allMatch, noneMatch:匹配操作
boolean anyMatch = stream.anyMatch(s -> s.startsWith("a")); boolean allMatch = stream.allMatch(s -> s.startsWith("a")); boolean noneMatch = stream.noneMatch(s -> s.startsWith("a"));
并行Stream
通过调用parallelStream
方法,可以创建一个并行的Stream,以充分利用多核处理器的优势。
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> parallelStream = list.parallelStream();
示例代码
以下是一个简单的示例,展示了如何使用Stream API来处理集合数据:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("apple", "banana", "cherry", "date", "elderberry", "fig", "grape");
// 使用Stream API进行操作
List<String> result = list.stream()
.filter(s -> s.length() > 5)
.map(String::toUpperCase)
.sorted()
.collect(Collectors.toList());
// 输出结果
result.forEach(System.out::println);
}
}
输出结果
BANANA
CHERRY
ELDERBERRY
个人理解
Stream就是提供一些操作,让我们对集合的操作更加方便。