Java基础:流Stream详解
什么是流Stream?
Java中的流(Stream)是指代表数据流通的对象。Stream与java.io包中的流不同,Stream没有io操作,是一种抽象的数据结构,是一种更高级、更便捷、更优雅的处理数据的方式。Stream的目的是通过类似于流水线的方式来处理集合中的元素,通过流的操作,可以将对集合的处理变得更加简单、减少代码量,提高代码可读性。
Stream特点:
- 不是数据结构:不像集合一样,Stream不是存储数据的数据结构,而是通过管道操作数据源(可以是集合,数组等)的元素序列;
- 惰性求值:操作并不离开数据源,且一般是延迟执行的,只有在需要的时候才执行;
- 数据消费一次:Stream在执行过程中只能被消费一次,一旦调用了终止操作,Stream会自动关闭。
Stream的操作
Stream的操作可以分为中间操作和终止操作两种。中间操作是在数据流经过管道后的一个环节,它可以对数据源(集合,数组等)的元素进行处理,处理后再传给下一个环节继续处理。而终止操作则是将处理完的数据流汇集起来并输出结果。Stream的中间操作和终止操作可以任意组合,这样可以构造出各种不同的数据处理流程。
中间操作
- filter(Predicate
predicate):过滤符合条件的元素,返回的是一个新的Stream; - map(Function
func):将元素类型转换为另外一种类型,返回的是一个新的Stream; - flatMap(Function
> mapper):将每个元素转换为一个或多个其他元素,并将所有元素合并到一个Stream中返回; - distinct():去重操作,返回的是一个新的Stream;
- sorted():对Stream中的数据进行排序操作,返回的是一个新的Stream;
- limit(int maxSize):对Stream中前maxSize个元素进行操作,返回的是一个新的Stream;
- skip(int n):去除前n个元素,返回的是一个新的Stream。
终止操作
- forEach(Consumer
action):消费Stream中的元素,没有返回值; - count():返回Stream中的元素个数;
- collect(Collector
collector):将Stream汇集起来并输出结果; - reduce(T identity, BinaryOperator
accumulator):使用给定的初始值identity和此Stream的元素相继调用二元运算,返回List中的所有元素的总和。
示例1:过滤出长度为5的名字
List<String> names = Arrays.asList("Tom", "Bob", "Mary", "Alice", "John");
names.stream()
.filter(name -> name.length() == 5)
.forEach(System.out::println);
输出结果:
Alice
示例2:计算集合中所有元素的和
List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5);
int sum = nums.stream()
.reduce(0, Integer::sum);
System.out.println(sum);
输出结果:
15
总结
Stream是Java8中非常重要和强大的数据处理工具,通过Stream的管道操作,可以大大简化代码,提高代码的可读性和维护性,尤其是处理基于数据集合的任务时,Stream更是展现了其强大的威力。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java基础:流Stream详解 - Python技术站