JAVA中的Stream
1、Stream是什么?
- Stream 是 Java 8 引入的一个新的抽象层,用于处理数据集合。
- 它可以让你以声明式的方式处理数据,类似于 SQL 语句的查询方式。
2、Stream能够做什么?
- 过滤:通过条件筛选数据。
- 映射:转换数据结构或类型。
- 排序:对数据进行排序。
- 聚合:如求和、最大值、最小值等。
- 匹配与查找:检查某些条件是否满足,或者查找特定元素。
3、Stream能给我带来什么好处?
- 简洁性:使用 Stream 可以让代码更加简洁、易读。
- 高效性:Stream 操作可以自动并行化,提高处理效率。
- 声明式编程:关注“做什么”而不是“怎么做”,降低出错概率。
4、Stream怎么使用?
1. 创建 Stream
从集合创建
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
从数组创建
int[] array = {1, 2, 3};
IntStream stream = Arrays.stream(array);
从文件创建
try (Stream<String> lines = Files.lines(Paths.get("file.txt"))) {
lines.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
2. 中间操作
filter
- 功能:过滤元素,只保留满足条件的元素。
- 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> shortNames = names.stream()
.filter(name -> name.length() < 5)
.collect(Collectors.toList());
map
- 功能:转换元素,将每个元素映射为另一个元素。
- 示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
List<Integer> squares = numbers.stream()
.map(n -> n * n)
.collect(Collectors.toList());
flatMap
- 功能:将多个流合并成一个流。
- 示例:
List<List<Integer>> listOfLists = Arrays.asList(
Arrays.asList(1, 2),
Arrays.asList(3, 4)
);
List<Integer> flattenedList = listOfLists.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
distinct
- 功能:去重,去除重复的元素。
- 示例:
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4);
List<Integer> uniqueNumbers = numbers.stream()
.distinct()
.collect(Collectors.toList());
sorted
- 功能:排序,对元素进行排序。
- 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> sortedNames = names.stream()
.sorted()
.collect(Collectors.toList());
limit
- 功能:限制流的大小,返回前 n 个元素。
- 示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> firstFive = numbers.stream()
.limit(5)
.collect(Collectors.toList());
skip
- 功能:跳过前 n 个元素。
- 示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> afterFirstFive = numbers.stream()
.skip(5)
.collect(Collectors.toList());
3. 终端操作
forEach
- 功能:遍历流中的每个元素。
- 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream().forEach(System.out::println);
collect
- 功能:收集结果,将流转换为其他形式的数据结构。
- 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> filterNames = names.stream()
.filter(name -> name.length() < 5)
.collect(Collectors.toList());
reduce
- 功能:聚合操作,将流中的元素减少为一个值。
- 示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream().reduce(0, Integer::sum);
anyMatch
- 功能:检查流中是否有任何元素满足给定的条件。
- 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
boolean anyStartsWithA = names.stream()
.anyMatch(name -> name.startsWith("A"));
allMatch
- 功能:检查流中所有元素是否都满足给定的条件。
- 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
boolean allStartWithA = names.stream()
.allMatch(name -> name.startsWith("A"));
noneMatch
- 功能:检查流中没有任何元素满足给定的条件。
- 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
boolean noneStartWithZ = names.stream()
.noneMatch(name -> name.startsWith("Z"));
findFirst
- 功能:返回流中的第一个元素。
- 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
Optional<String> first = names.stream()
.findFirst();
findAny
- 功能:返回流中的任意一个元素。
- 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
Optional<String> any = names.stream()
.findAny();
count
- 功能:返回流中元素的数量。
- 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
long count = names.stream()
.count();
max
- 功能:返回流中的最大值。
- 示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
Optional<Integer> max = numbers.stream()
.max(Integer::compare);
min
- 功能:返回流中的最小值。
- 示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
Optional<Integer> min = numbers.stream()
.min(Integer::compare);
toArray
- 功能:将流转换为数组。
- 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
String[] array = names.stream()
.toArray(String[]::new);
5、Stream的原理是什么?
- 惰性求值:中间操作不会立即执行,只有在终端操作时才会触发整个流水线的执行。
- 内部迭代:由系统控制迭代过程,而不是显式地编写循环。
- 并行处理:支持并行流,可以通过 parallelStream() 方法实现。
- 操作类型:中间操作返回新的 Stream,终端操作触发执行并产生结果。
- 生命周期:从创建到中间操作再到终端操作,形成完整的流处理流程。
6、Stream总结
- Stream 是 Java 8 引入的强大工具,简化了集合数据的处理。
- 通过声明式编程风格,使代码更加简洁、易读。
- 支持惰性求值和内部迭代,提高了性能和并发处理能力。
- 在实际开发中,合理使用 Stream 可以显著提升开发效率和代码质量。