使用Java中的Stream函数处理集合数据的实例教程
Java中的Stream函数是一种强大而灵活的数据处理工具。它可以让我们通过一些连贯、函数式的调用,以流的形式处理集合数据,做到高效且优美的代码。在本教程中,我们将会使用一个简单的集合数据进行展示,并逐步说明Stream的常用操作。
## Stream的基础
首先要知道,Stream是Java 8中引入的一个新的程序api,它是一个集合元素的序列,并且在同一时间只能处理一个元素。一个流具有如下特点:
- 不是数据结构:Stream不是一个数据结构,其并不会模拟存储元素的容器。与之不同,它是一个通过一些操作处理数据的元素序列。
- 延迟执行:Stream并不会立即执行操作,相反,它会在需要的时候才开始执行。
- 一次性使用:Stream只能被处理一次。在Stream处理过后,将不能再次使用。
定义Stream的方式有两种:from collection(Stream的集合方式)、from Supplier(Stream供给方式)。下面是两种创建Stream的方式:
List<String> list = Arrays.asList("1", "2", "3" ,"4");
Stream<String> stream1 = list.stream(); //从集合方式
Stream<String> stream2 = Stream.of("1", "2", "3"); //从供给方式
## 中间操作
Stream的操作分为两种:中间操作和终止操作。中间操作是指在Stream的序列上进行转换的操作。下面的代码展示了几个常见的Stream中间操作。
### Filter
Filter是一个接收一个谓词(Predicate)的元素,将Stream序列中的满足条件的元素筛选出来,生成一个新的序列。
List<String> list = Arrays.asList("test", "has", "test1" ,"notation2");
List<String> result = list.stream()
.filter(s -> s.contains("test"))
.collect(Collectors.toList());
### Map
Map是将一个Stream序列中的元素转换为另一个元素,生成一个新的Stream序列。
List<Integer> list = Arrays.asList(0, 1, 2, 3, 4);
List<Integer> result = list.stream()
.map(i -> i + 1)
.collect(Collectors.toList());
### Distinct
Distinct是将一个Stream序列中重复的元素去重。
List<Integer> list = Arrays.asList(0, 1, 2, 3, 4, 0, 1, 2);
List<Integer> result = list.stream()
.distinct()
.collect(Collectors.toList());
### Sorted
Sorted是将一个Stream序列中的元素进行升序排序。
List<Integer> list = Arrays.asList(5, 7, 2, 6, 9, 4, 1, 3, 8);
List<Integer> result = list.stream()
.sorted()
.collect(Collectors.toList());
## 终止操作
终止操作是指对Stream序列进行终止操作,生成一个结果。下面的代码展示了几个常见的Stream终止操作。
### Foreach
Foreach是对Stream序列进行遍历操作,对每个元素执行指定的操作。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); list.stream().forEach(System.out::println);
### Reduce
Reduce是一种归纳操作,将Stream序列中的元素通过指定的操作进行归纳汇聚,生成一个新的元素。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> sum = list.stream()
.reduce((x, y) -> x + y);
if (sum.isPresent()) {
System.out.println(sum.get());
}
### Collect
Collect将Stream序列中的元素归约成一个新的集合。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = list.stream()
.sorted()
.collect(Collectors.toList());
## 总结
Stream是JDK 8中非常有用的一个API,可以帮助我们对集合进行高效流畅的操作。在使用的过程中,我们要注意Stream的特性,并且结合实际的业务场景进行合理应用。
