Java 中 Stream 的中间方法
在 Java 中,流允许我们对指定元素执行功能操作。它只是通过各种内置方法将源元素(例如数组、文件和集合框架的类)引导到返回结果。这些内置方法可以是中间方法,也可以是终端方法。在本文中,我们将探讨 Stream 的一些中间方法,例如 map、filter、reduce 和 collect。这些方法帮助我们操作和处理数据。
Java 流的中间方法
Java 流的方法统称为高阶函数,进一步分类为 -
中间方法 - 它们处理输入流的元素。
终端方法 - 它们触发中间操作以产生非流结果,例如打印、计数和存储。
在本节中,我们将借助各种示例仅讨论流的中间方法。
Java 中流的中间方法列表 -
filter()
map()
peek()
limit()
skip()
sorted()
distinct()
让我们逐一讨论它们。
filter() 方法
Java filter() 方法允许我们根据指定条件筛选流中的元素。它用于对流项目应用特定行为。此方法将谓词作为参数并返回与谓词匹配的元素列表。
语法
filter(predicate);
示例
以下示例说明了 filter() 方法的用法。
使用 Arrays.asList() 方法创建一个列表,用于存储固定大小的列表。
现在,使用 filter() 方法以及 stream() 和 forEach() 仅过滤掉奇数。这里,stream() 以流的形式指定输入,我们将使用终端方法 forEach() 进行迭代并打印奇数。
import java.util.*; public class Fltr { public static void main(String[] args) { // 创建数字列表 List<Integer> numbers = Arrays.asList(5, 21, 32, 14, 63, 19, 10); // 打印列表中的所有数字 System.out.println("所有数字列表:" + numbers); System.out.println("奇数列表:"); // 仅从列表中筛选奇数 numbers.stream() .filter(nums -> nums % 2 == 1) .forEach(System.out::println); } }
输出
List of all numbers: [5, 21, 32, 14, 63, 19, 10] List of odd numbers: 5 21 63 19
map() 方法
此方法以 Function 作为参数,并将其应用于 Stream 的每个元素,这将生成一个映射元素的新 Stream。例如,我们可以使用 map() 将字符串 Stream 转换为整数 Stream。
示例
在此示例中,我们将使用 map() 方法将一个列表的元素复制到另一个列表。
import java.util.*; import java.util.stream.Collectors; public class MapExample { public static void main(String[] args) { // 创建整数列表 List<Integer> AList1 = Arrays.asList(11, 22, 33, 44, 55); // 将第一个列表的元素复制到新列表 List<Integer> AList2 = AList1.stream() // 复制元素 .map(i -> i) // 收集结果 .collect(Collectors.toList()); // 打印结果 System.out.println("列表的元素:" + AList2); } }
输出
列表的元素:[11, 22, 33, 44, 55]
peek() 方法
我们可以使用 peek() 方法打印每个中间操作的结果。
示例
在下面的例子中,我们将使用 filter() 方法和 peek() 从数字列表中打印奇数。
import java.util.*; import java.util.stream.Collectors; public class PeekExample { public static void main(String[] args) { // 创建数字列表 List<Integer> numbers = Arrays.asList(5, 21, 32, 14, 63, 19, 10); // 打印列表中的所有数字 System.out.println("所有数字列表:" + numbers); System.out.println("奇数列表:"); // 仅从列表中过滤奇数 numbers.stream() .filter(nums -> nums % 2 == 1) // 使用 peek 获取结果 .peek(nums -> System.out.println(nums)) // 收集结果 .collect(Collectors.toList()); } }
输出
所有数字列表:[5, 21, 32, 14, 63, 19, 10] 奇数列表: 5 21 63 19
limit() 方法
使用 limit() 方法的目的是将输出的大小限制为指定的限制。
示例
在此示例中,我们将借助 limit() 方法将中间操作的结果限制为指定的大小。
import java.util.*; public class LimitExample { public static void main(String[] args) { // 创建数字列表 List<Integer> numbers = Arrays.asList(5, 21, 32, 14, 63, 19, 10); // 打印列表中的所有数字 System.out.println("所有数字列表:" + numbers); System.out.println("奇数列表:"); // 仅从列表中过滤奇数 numbers.stream() .filter(nums -> nums % 2 == 1) // 将结果限制为 2 .limit(2) .forEach(System.out::println); } }
输出
所有数字列表:[5, 21, 32, 14, 63, 19, 10] 奇数列表: 5 21
skip() 方法
我们可以使用 skip() 方法从结果中丢弃前 n 个元素。它以一个整数作为参数,指定将被丢弃的元素。
示例
以下示例演示如何使用 skip() 方法从过滤结果中丢弃前两个元素。
import java.util.*; public class SkipExample { public static void main(String[] args) { // 创建数字列表 List<Integer> numbers = Arrays.asList(5, 21, 32, 14, 63, 19, 10); // 打印列表中的所有数字 System.out.println("所有数字列表:" + numbers); System.out.println("奇数列表:"); // 仅从列表中过滤奇数 numbers.stream() .filter(nums -> nums % 2 == 1) // 从结果中跳过前 2 个元素 .skip(2) .forEach(System.out::println); } }
输出
所有数字列表:[5, 21, 32, 14, 63, 19, 10] 奇数列表: 63 19
sorted() 方法
此方法可用于按升序对流中的元素进行排序。
示例
以下示例说明了如何借助 sorted() 方法按升序对流中的元素进行排序。
import java.util.*; public class SortedExample { public static void main(String[] args) { // 创建数字列表 List<Integer> numbers = Arrays.asList(5, 21, 32, 14, 63, 19, 10); // 按升序打印列表中的所有数字 System.out.println("数字列表:"); // 对列表元素进行排序 numbers.stream() .sorted() .forEach(System.out::println); } }
输出
数字列表: 5 10 14 19 21 32 63
distinct() 方法
要从流的元素中删除重复项,我们可以使用 distinct() 方法。
示例
在此示例中,我们将创建一个包含重复元素的流,并应用 distinct() 方法仅打印不同的元素。
import java.util.*; public class DistinctExample { public static void main(String[] args) { // 创建数字列表 List<Integer> numbers = Arrays.asList(21, 21, 32, 14, 19, 19, 10, 10); System.out.println("不同的数字列表:"); // 从列表中删除重复的数字 numbers.stream() .distinct() .forEach(System.out::println); } }
输出
不同的数字列表: 21 32 14 19 10
结论
我们从定义流及其中间方法开始本文,这些方法是 Java 中高阶函数的一部分。在下一节中,我们借助示例程序详细讨论了中间方法。