Java的Stream流是Java 8引入的一种新特性,提供了一种高效和简洁的处理集合(如List、Set等)的方法。Stream流允许我们以函数式编程的方式对数据进行操作,它可以在内存中以一种声明的方式表达数据的处理的管道。
Stream的特点
- 不可变性:流本身不存储数据,也没有修改源数据的能力。每次对流的操作都会生成一个新的流。
- 惰性求值:流操作是惰性执行的,只有在终止操作时,流的处理才会真正执行。
- 链式操作:流的操作可以通过链式调用实现,例如过滤、映射、收集等。
常用的Stream操作
Stream操作通常分为中间操作和终止操作。
1. 中间操作
- filter:过滤符合条件的元素
- map:映射每个元素到另一个元素
- sorted:对元素进行排序
- distinct:去重
- limit:限制结果的数量
- skip:跳过前n个元素
2. 终止操作
- forEach:迭代流中的每个元素
- collect:将流转换成集合
- reduce:对流中的元素进行归约操作
- count:统计元素个数
- anyMatch/allMatch/noneMatch:检查流中是否存在符合条件的元素
示例代码
以下是使用Java Stream流的一个简单示例:
import java.util.*;
import java.util.stream.*; public class StreamExample { public static void main(String[] args) { List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Edward"); // 过滤以字母'C'开头的名字,并将名字转换为大写 List<String> filteredNames = names.stream() .filter(name -> name.startsWith("C")) .map(String::toUpperCase) .collect(Collectors.toList()); System.out.println(filteredNames); // 输出: [CHARLIE] // 计算名字的总长度 int totalLength = names.stream() .mapToInt(String::length) .sum(); System.out.println("Total length: " + totalLength); // 输出: Total length: 27 // 打印所有的名字 names.stream().forEach(System.out::println); }
}
注意事项
- Stream流只能被消费一次,消费后将无法再次使用。
- 适合处理大量数据,而不适合小数据集,因为流操作存在开销。
小结
Java Stream API 提供了一种高效、易于理解且功能强大的方式来处理集合,通过流式操作可以让代码更加简洁和清晰,提升开发效率。