在上一篇博客中,我介绍了构建 Stream 流的多种方式,以及 Stream 流的特点和优势。如果你还没有阅读,你可以点击这里查看。
Java基础 - Stream 流:构建流的多种方式
在这篇博客中,我将探索 Stream API 的中间操作,它们可以让你对 Stream 流进行各种转换和过滤,从而得到你想要的结果。
Stream API 的中间操作是指那些返回一个新的 Stream 流对象的操作,它们不会消耗 Stream 流,也不会产生最终的结果,而是可以链式地调用,形成一个操作管道。Stream API 提供了很多中间操作,可以分为以下几类:
filter
, distinct
, limit
, skip
等。map
, flatMap
, peek
等。sorted
, reverseOrder
等。findAny
, findFirst
, anyMatch
, allMatch
, noneMatch
等。takeWhile
, dropWhile
等。下面,我将用一些示例来展示这些中间操作的用法和效果。
filter
操作可以让你根据一个谓词(Predicate)来筛选出 Stream 流中符合条件的元素,返回一个新的 Stream 流对象。例如:
// 创建一个 Stream 流对象
Stream<Integer> numberStream = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 使用 filter 操作筛选出偶数
Stream<Integer> evenStream = numberStream.filter(n -> n % 2 == 0);
// 输出 [2, 4, 6, 8, 10]
evenStream.forEach(System.out::println);
distinct
操作可以让你去除 Stream 流中的重复元素,返回一个新的 Stream 流对象。例如:
// 创建一个 Stream 流对象
Stream<String> animalStream = Stream.of("cat", "dog", "cat", "elephant", "dog", "fox");
// 使用 distinct 操作去除重复元素
Stream<String> uniqueStream = animalStream.distinct();
// 输出 [cat, dog, elephant, fox]
uniqueStream.forEach(System.out::println);
limit
操作可以让你限制 Stream 流中的元素个数,返回一个新的 Stream 流对象。例如:
// 创建一个 Stream 流对象
Stream<String> fruitStream = Stream.of("apple", "banana", "cherry", "durian", "elderberry", "fig");
// 使用 limit 操作限制元素个数为 3
Stream<String> limitedStream = fruitStream.limit(3);
// 输出 [apple, banana, cherry]
limitedStream.forEach(System.out::println);
skip
操作可以让你跳过 Stream 流中的前 n 个元素,返回一个新的 Stream 流对象。例如:
// 创建一个 Stream 流对象
Stream<String> colorStream = Stream.of("red", "green", "blue", "yellow", "pink", "purple");
// 使用 skip 操作跳过前 2 个元素
Stream<String> skippedStream = colorStream.skip(2);
// 输出 [blue, yellow, pink, purple]
skippedStream.forEach(System.out::println);
map
操作可以让你将 Stream 流中的每个元素映射为另一种类型或者形式,返回一个新的 Stream 流对象。例如:
// 创建一个 Stream 流对象
Stream<String> nameStream = Stream.of("Alice", "Bob", "Charlie", "David");
// 使用 map 操作将每个元素转换为大写
Stream<String> upperStream =