Java8 Stream API深度解析:中间操作实例

0 下载量 158 浏览量 更新于2024-09-01 收藏 69KB PDF 举报
"Java8 Stream中间操作实例解析" 在Java 8中,Stream API的引入为处理集合数据提供了全新的方式,它支持函数式编程的概念,允许我们以声明性风格处理数据。Stream API的设计目标是能够方便地进行并行处理,同时保持代码简洁易读。 中间操作是Stream API中的一个重要组成部分,它们是惰性的,意味着它们不会立即执行,而是等待终端操作触发时才开始执行。中间操作可以连接在一起,形成一个流水线,每个操作都会返回一个新的Stream,以便进行后续的操作。以下是一些常见的中间操作及其功能: 1. filter(): 这个方法用于过滤出满足特定条件的元素。例如: ```java List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5); List<Integer> filteredNums = nums.stream().filter(n -> n > 2).collect(Collectors.toList()); // filteredNums: [3, 4, 5] ``` 这个例子中,`filter()`方法接收一个谓词(条件),返回一个新的Stream,其中包含原集合中大于2的元素。 2. map(): 这个方法用于将每个元素应用一个函数,生成一个新的Stream。例如: ```java List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); List<Integer> lengths = names.stream().map(String::length).collect(Collectors.toList()); // lengths: [5, 3, 7] ``` 在这里,`map()`方法将每个字符串转换为其长度。 3. flatMap(): 与`map()`类似,但用于将每个元素映射成另一个Stream,然后将所有这些Stream合并成一个单一的Stream。例如: ```java List<String> words = Arrays.asList("Hello", "world"); List<Character> characters = words.stream() .flatMap(word -> word.chars().boxed()) .collect(Collectors.toList()); // characters: [H, e, l, l, o, w, o, r, l, d] ``` `flatMap()`将每个单词拆分成字符,并将所有字符放入一个单一的Stream。 4. distinct(): 用于去除重复的元素,返回一个不包含重复元素的新Stream。例如: ```java List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 3, 3, 4, 4, 4, 4); List<Integer> uniqueNumbers = numbers.stream().distinct().collect(Collectors.toList()); // uniqueNumbers: [1, 2, 3, 4] ``` 5. sorted(): 对Stream中的元素进行排序。可以是自然排序或自定义比较器排序。例如: ```java List<Integer> unsorted = Arrays.asList(5, 3, 9, 1, 7); List<Integer> sorted = unsorted.stream().sorted().collect(Collectors.toList()); // sorted: [1, 3, 5, 7, 9] ``` 6. peek(): 类似于`map()`,但除了应用函数外,还会保留原始元素。主要用于调试,因为它的结果不会影响最终的Stream。例如: ```java List<String> list = Arrays.asList("A", "B", "C"); list.stream().peek(System.out::println).collect(Collectors.toList()); // 输出: A, B, C ``` 7. limit(): 限制Stream中元素的数量。例如: ```java List<String> longList = Arrays.asList("One", "Two", "Three", "Four", "Five"); List<String> shortList = longList.stream().limit(3).collect(Collectors.toList()); // shortList: [One, Two, Three] ``` 8. skip(): 跳过Stream中前n个元素。例如: ```java List<String> list = Arrays.asList("First", "Second", "Third", "Fourth"); List<String> skipped = list.stream().skip(2).collect(Collectors.toList()); // skipped: [Third, Fourth] ``` 终端操作是Stream操作的最后一步,它们会消耗Stream并产生结果。以下是一些常见的终端操作: 1. forEach(): 对Stream中的每个元素执行一个消费者操作。例如: ```java List<String> fruits = Arrays.asList("Apple", "Banana", "Cherry"); fruits.stream().forEach(System.out::println); // 输出: Apple, Banana, Cherry ``` 2. forEachOrdered(): 和`forEach()`类似,但确保元素按照Stream的顺序处理。 3. toArray(): 将Stream转换为数组。例如: ```java int[] array = IntStream.range(1, 4).toArray(); // array: [1, 2, 3] ``` 4. reduce(): 对Stream中的元素进行聚合操作,如求和、求积等。例如: ```java int sum = Arrays.asList(1, 2, 3, 4, 5).stream().reduce(0, Integer::sum); // sum: 15 ``` 5. collect(): 收集Stream中的元素到一个集合、映射或其他结构。例如: ```java Map<String, Integer> nameLengths = names.stream() .collect(Collectors.toMap(Function.identity(), String::length)); // nameLengths: {Alice=5, Bob=3, Charlie=7} ``` 6. min() 和 max(): 找到Stream中最小或最大的元素。例如: ```java OptionalInt minAge = people.stream().mapToInt(Person::getAge).min(); OptionalInt maxAge = people.stream().mapToInt(Person::getAge).max(); ``` 7. count(): 计算Stream中的元素数量。例如: ```java long count = numbers.stream().filter(n -> n > 2).count(); // count: 4 ``` 8. anyMatch(), allMatch() 和 noneMatch(): 检查Stream中是否存在满足条件的元素,是否所有元素都满足条件,或是否没有元素满足条件。例如: ```java boolean hasLongWord = words.stream().anyMatch(word -> word.length() > 5); boolean allWordsStartWithA = words.stream().allMatch(word -> word.startsWith("A")); boolean noWordsEndWithZ = words.stream().noneMatch(word -> word.endsWith("Z")); ``` 9. findFirst() 和 findAny(): 在Stream中查找第一个或任意一个满足条件的元素。例如: ```java Optional<String> firstLongWord = words.stream().filter(word -> word.length() > 5).findFirst(); Optional<String> anyCapitalizedWord = words.stream().filter(word -> word.startsWith("A")).findAny(); ``` 通过结合使用这些中间操作和终端操作,开发者可以构建出高效、可读性强的代码,处理各种集合数据处理任务。Java 8的Stream API大大提升了集合处理的能力,使其更适合大数据和并行计算。