欢迎访问宙启技术站
智能推送

使用Java中的Stream函数处理集合数据的实例教程

发布时间:2023-06-06 23:17:47

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的特性,并且结合实际的业务场景进行合理应用。