掌握OpenJDK 12中的Java Stream高级应用示例

需积分: 10 1 下载量 174 浏览量 更新于2025-01-17 收藏 7KB ZIP 举报
Java流(Stream)是Java 8中引入的一个新特性,它允许我们以声明式的方式处理数据集合,可以看作是高级的迭代器。Java流不是一种数据结构,不保存数据,而是对数据源进行一系列处理操作的集合。流可以串行执行,也可以并行执行,这使得对大数据集的操作更加高效。OpenJDK是Java开发工具包的一个开源实现,而OpenJDK 12是该系列的一个版本。 ### Java流的相关知识点 #### 1. 流的分类 - **输入流(InputStream)**:用于从不同数据源读取数据。 - **输出流(OutputStream)**:用于向不同目的地写出数据。 - **字节流**:处理字节数据的流。 - **字符流**:处理字符数据的流。 - **节点流**:直接与数据源(或目的地)相连的流。 - **处理流**:建立在节点流之上,用于对数据进行处理。 #### 2. 流的操作 - **创建流**:可以使用集合类的`.stream()`方法或`Stream.of()`方法创建流。 - **中间操作**(Intermediate Operations):如`filter()`, `map()`, `sorted()`等,它们产生一个新的流作为它们的输出。 - **终止操作**(Terminal Operations):如`forEach()`, `collect()`, `reduce()`等,它们触发流的计算并产生结果或副作用。 #### 3. 使用OpenJDK 12的Java Stream示例 ##### a. 整数数组的流 ```java int[] numbers = {1, 2, 3, 4, 5}; Arrays.stream(numbers).forEach(System.out::println); ``` 该示例展示了如何创建一个整数数组的流,并使用`forEach`方法进行迭代输出。 ##### b. 字符串流 ```java Stream.of("one", "two", "three") .filter(s -> s.startsWith("t")) .forEach(System.out::println); ``` 这里,`Stream.of`方法用于创建一个字符串流,`filter`方法用于过滤出以"t"开头的字符串,最后使用`forEach`打印过滤后的字符串。 ##### c. 文件流 ```java Files.lines(Paths.get("file.txt")) .map(s -> s.split(",")) .forEach(System.out::println); ``` 这里展示了如何读取文件内容,将其按行分割成流,并输出每一行的内容。 ##### d. 控制台阅读器的流 ```java BufferedReader reader = new BufferedReader(new FileReader("input.txt")); reader.lines().forEach(System.out::println); reader.close(); ``` 这段代码使用`BufferedReader`读取文件,并将其内容转换成流,之后使用`forEach`操作输出每一行。 ##### e. 流与列表的结合使用 - **forEachWithList()**:遍历列表中的每个元素。 ```java list.forEach(System.out::println); ``` - **reduceWithList()**:对列表中的元素进行累积计算。 ```java Optional<Integer> sum = list.stream().reduce(Integer::sum); ``` - **filterAndMapWithList()**:先过滤列表,再对结果映射处理。 ```java List<String> filteredList = list.stream() .filter(s -> s.startsWith("a")) .map(s -> s.toUpperCase()) .collect(Collectors.toList()); ``` - **employeePOJOPrintWithList()**:打印员工信息列表。 ```java list.forEach(System.out::println); ``` - **employeePOJOSortingByEmployeeIdWithList()**:按员工ID排序。 ```java list.stream() .sorted(Comparator.comparing(Employee::getId)) .forEach(System.out::println); ``` - **employeePOJOSortingByEmployeeNameWithList()**:按员工姓名排序。 ```java list.stream() .sorted(Comparator.comparing(Employee::getName)) .forEach(System.out::println); ``` - **employeePOJOSortingByEmployeeSalaryWithList()**:按员工薪水排序。 ```java list.stream() .sorted(Comparator.comparing(Employee::getSalary).reversed()) .forEach(System.out::println); ``` - **employeePOJOFilterByEmployeeSalaryWithList()**:过滤出薪水高于特定值的员工。 ```java list.stream() .filter(e -> e.getSalary() > salaryThreshold) .forEach(System.out::println); ``` 以上示例中的`Employee`是POJO(Plain Old Java Object)类,代表员工信息,包含属性如ID、姓名和薪水等。 #### 4. Java中的函数式接口 - **Predicate**:用于判断测试条件的接口。 - **Function**:用于转换操作的接口。 - **Consumer**:用于消费操作的接口。 - **Supplier**:用于提供操作的接口。 以上是使用Java Stream时常见的函数式接口,它们在流的中间操作中起到关键作用。 #### 5. Java流的并行处理 在处理大数据集时,可以通过将流转换为并行流来提高效率,例如使用`.parallel()`方法。 ```java IntStream.range(1, 100).parallel().forEach(System.out::println); ``` 并行流使用共享的并行化框架(Fork/Join框架),可以自动将数据分割成多个部分,并在多个线程上并行执行。 #### 6. Java流的性能考量 虽然并行流可以提高性能,但并不总是适用。并行流的性能取决于多个因素,包括流的数据大小、流操作的类型、机器的CPU核心数等。有时,顺序流比并行流更快,尤其是当数据集比较小或者操作不够复杂时。 ### 结论 Java Stream为处理集合数据提供了强大的功能,极大地简化了代码,并通过函数式编程提高了代码的表达力。OpenJDK 12中Java Stream的使用示例涵盖了创建和操作流的基本知识。重要的是要理解流的操作类型、函数式接口以及如何利用流的特性来优化代码性能。通过不断实践和理解Java Stream,开发者可以编写出更加简洁、高效且易于维护的代码。
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部