Java 8引入了Stream API,Stream是一种数据处理流程,可以进行筛选、排序、聚合等操作。相比于旧的集合遍历方式,Stream使得代码更加简洁、灵活并且易于并行处理大数据量。
1. Stream简介
1.1 什么是Stream
Stream是Java 8引入的一个新API,它允许我们以声明式的方式遍历集合、数组等数据源,把复杂的操作串起来,形成一条流水线。Stream本质上是一个从数据源生成的元素序列,其主要作用是对集合/数组进行聚合操作。
1.2 使用Stream的好处
Stream的好处主要有以下几点:
- 声明式编程风格,代码更加简洁易懂。
- 支持并行处理,可以充分利用多核CPU的优势,处理大规模数据集合。
- 内置大量函数式接口,可以避免一些基本逻辑的重复实现。
1.3 与集合的关系
在Java 8之前,我们对集合进行操作时,通常会使用迭代器或者foreach语句。这种方式虽然简单易懂,但是需要人工控制循环变量,代码可读性不高。
Java 8引入了Stream API,使得我们可以以一种更加简洁、优雅的方式对集合进行操作。Stream提供了一些常用的操作方法,如filter、map、reduce等,可以实现从集合中筛选、转换、统计等常见操作。同时,Stream也支持并行处理,可以提高大数据集合处理的效率。
2. Stream基本用法
2.1 生成Stream
生成一个Stream需要以下步骤:
- 获取一个数据源,如集合、数组等。
- 创建一个Stream对象,可以通过Stream的静态工厂方法来创建。
Stream的两种来源如下:
2.1.1 通过Collection生成
List<String> list = Arrays.asList("java", "python", "C");
Stream<String> stream = list.stream();
2.1.2 通过Array生成
String[] array = new String[]{"java", "python", "C"};
Stream<String> stream = Arrays.stream(array);
2.2 Stream的操作
Stream有两种操作类型:中间操作和终止操作。中间操作是返回Stream对象本身的操作,可以连续调用多个中间操作,直到终止操作被调用。终止操作是返回其他类型的操作,会终结Stream的遍历,并返回结果。
下面我们来一一介绍Stream的几种操作。
2.2.1 筛选操作
- filter:对Stream中的元素进行过滤,返回一个由符合条件的元素组成的Stream。
List<String> list = Arrays.asList("java", "python", "C");
list.stream().filter(s -> s.startsWith("j")).forEach(System.out::println);
输出结果:
java
- distinct:通过Stream中元素的equals和hashCode方法去除重复元素。
List<Integer> list = Arrays.asList(1, 2, 3, 3, 2);
list.stream().distinct().forEach(System.out::println);
输出结果:
1
2
3
2.2.2 转换操作
- map:将一个Stream中的每个元素都应用一个函数,返回一个由结果组成的新Stream。
List<String> list = Arrays.asList("hello", "world", "java");
list.stream().map(s -> s.toUpperCase()).forEach(System.out::println);
输出结果:
HELLO
WORLD
JAVA
2.2.3 统计操作
- count:返回Stream中元素的个数。
List<String> list = Arrays.asList("hello", "world", "java");
long count = list.stream().count();
System.out.println(count);
输出结果:
3
2.2.4 终止操作
- forEach:遍历Stream中的每个元素,对每个元素执行指定操作。
List<String> list = Arrays.asList("hello", "world", "java");
list.stream().forEach(System.out::println);
输出结果:
hello
world
java
- collect:将Stream中的元素转换为其他集合类型,如List、Set、Map等。
List<String> list = Arrays.asList("hello", "world", "java");
List<String> newList = list.stream().filter(s -> s.startsWith("h")).collect(Collectors.toList());
System.out.println(newList);
输出结果:
[hello]
2.3 并行处理
Stream可以方便地以并行方式处理数据,提高处理效率。可以通过parallelStream方法来获得一个并行版的Stream对象。
List<String> list = Arrays.asList("hello", "world", "java");
list.parallelStream().forEach(System.out::println);
输出结果:
world
java
hello
3. 示例
下面我们来实现两个具体的示例,对比一下使用Stream和传统方式的差异。
3.1 集合求和
假设有一个整型List,我们想求其所有元素之和。使用传统方式,我们需要使用循环变量遍历集合中的每个元素,然后求和。代码如下:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int sum = 0;
for (int i : list) {
sum += i;
}
System.out.println(sum);
使用Stream,我们可以通过一条语句实现该功能:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int sum = list.stream().mapToInt(Integer::intValue).sum();
System.out.println(sum);
其中,mapToInt方法是将Integer对象转换成int类型,sum方法是对所有int类型的数值求和。
3.2 集合去重复
假如有一个String型的List,需要去除其中重复的元素。使用传统方式,我们需要使用Set来过滤掉重复元素,代码如下:
List<String> list = Arrays.asList("java", "python", "C", "C", "java");
Set<String> set = new HashSet<>(list);
for (String s : set) {
System.out.println(s);
}
使用Stream,我们可以通过一条语句实现该功能:
List<String> list = Arrays.asList("java", "python", "C", "C", "java");
list.stream().distinct().forEach(System.out::println);
其中,distinct方法会去除重复元素,forEach方法实现遍历输出。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java8新特性 stream流的方式遍历集合和数组操作 - Python技术站