Java Stream 取 List 最后一个

在 Java 中,我们经常需要处理集合中的数据。Java 8 引入了 Stream API,使得集合操作更加简洁和可读。在处理集合的时候,有时候我们需要取得 List 中的最后一个元素。

本文将介绍如何使用 Java Stream 来取得 List 的最后一个元素。我们将从 Stream API 的基础知识开始,逐步介绍如何使用 Stream 来操作 List,并展示如何取得最后一个元素。

Stream API 简介

Stream API 是 Java 8 引入的一个新特性,它提供了一种更简洁和可读的方式来操作集合。Stream API 可以用来处理一系列的数据,包括集合、数组、I/O 等等。

Stream 是一个连续的数据流,它可以进行过滤、映射、排序等操作。Stream 有两种类型:中间操作和终端操作。中间操作会返回一个新的 Stream,而终端操作会返回一个结果(如一个值或一个集合)。

在使用 Stream API 之前,我们需要先将数据源转换为 Stream。对于 List 来说,可以通过调用 stream() 方法来获取一个 Stream,例如:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> numberStream = numbers.stream();

使用 Stream 取得 List 最后一个元素

现在我们已经将 List 转换成了 Stream,接下来我们可以使用 Stream 的终端操作来取得 List 的最后一个元素。

有多种方式可以实现这个目标,下面我们将介绍两种常见的方法。

方法一:使用 reduce 方法

reduce 方法可以将 Stream 中的元素进行累加、合并等操作。我们可以使用 reduce 方法来取得 List 的最后一个元素。

下面是使用 reduce 方法来取得 List 最后一个元素的示例代码:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

Optional<Integer> lastNumber = numbers.stream()
                                      .reduce((a, b) -> b);

if (lastNumber.isPresent()) {
    System.out.println("Last number: " + lastNumber.get());
}

在上面的代码中,我们使用了 reduce 方法来将 Stream 中的元素依次进行累加操作。由于我们只需要取得最后一个元素,所以可以使用 b 来表示最后一个元素,最后返回该元素。

方法二:使用 skipfindFirst 方法

另一种方法是使用 skipfindFirst 方法来取得 List 的最后一个元素。

skip 方法用于跳过前面指定数量的元素,而 findFirst 方法用于取得 Stream 中的第一个元素。

下面是使用 skipfindFirst 方法来取得 List 最后一个元素的示例代码:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

Optional<Integer> lastNumber = numbers.stream()
                                      .skip(numbers.size() - 1)
                                      .findFirst();

if (lastNumber.isPresent()) {
    System.out.println("Last number: " + lastNumber.get());
}

在上面的代码中,我们使用了 skip 方法来跳过前面 numbers.size() - 1 个元素,然后使用 findFirst 方法来取得剩下的第一个元素,即最后一个元素。

完整示例

下面是一个完整的示例代码,演示了如何使用 Stream 来取得 List 的最后一个元素:

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;

public class LastElementExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        // 使用 reduce 方法
        Optional<Integer> lastNumber1 = numbers.stream()
                                               .reduce((a, b) -> b);

        if (lastNumber1.isPresent()) {
            System.out.println("Last number (using reduce): " + lastNumber1.get());
        }

        // 使用 skip 和 findFirst 方法
        Optional<Integer> lastNumber2 = numbers.stream()
                                               .skip(numbers.size() - 1)
                                               .findFirst();

        if (lastNumber2.isPresent()) {
            System.out.println("Last number (using skip and findFirst): " + lastNumber2.get());