Java8-11新特性总结(五) Stream

Java 8 Stream

概要

  • Java 8 API 添加了一种新的抽象称为流Stream,Stream以一种声明的方式处理数据。
  • Stream以一种类似SQL语句从数据库查询数据的直观方式在Java集合运算和表达的抽象中体现。
  • Stream API 可以极大提高Java程序员的生产力并写出高效率、干净、简洁的代码。
  • 将集合看作流,流通过管道传输并在节点上进行筛选、排序、聚合等处理。
  • 管道处理分为中间操作处理(intermediate operation)和最终操作处理(terminal operation)。

什么是Stream?

Stream(流)是一个来自数据源的元素队列并支持聚合操作。

注:

元素队列:特定类型对象并形成一个队列。

数据源:流的来源。可以是集合,数组,I/O channel,产生器generator等。

聚合操作:filter、map、reduce、find、match、sorted等中间操作。

Pipelining::中间操作都会返回流对象本身。这样多个操作可以串联成一个管道,如同流式风格(fluent style)。这样做可以对操作进行优化,比如延迟执行(laziness)和短路( short-circuiting)。

内部迭代:以前对集合遍历都是通过Iterator或者For-Each的方式,显式的在集合外部进行迭代,这叫做外部迭代。Stream提供了内部迭代的方式,通过访问者模式(Visitor)实现。

生成流

使用Collection下的 stream() 和 parallelStream() 方法。

List<String> list = new ArrayList<>();
Stream<String> stream = list.stream(); //获取一个顺序流
Stream<String> parallelStream = list.parallelStream(); //获取一个并行流

使用Arrays 中的 stream() 方法,将数组转成流。

Integer[] nums = new Integer[10];
Stream<Integer> stream = Arrays.stream(nums);

使用Stream中的静态方法:of()、iterate()、generate()。

Stream<Integer> stream = Stream.of(1,2,3,4,5,6);
 
Stream<Integer> stream2 = Stream.iterate(0, (x) -> x + 2).limit(6);
stream2.forEach(System.out::println); // 0 2 4 6 8 10
 
Stream<Double> stream3 = Stream.generate(Math::random).limit(2);
stream3.forEach(System.out::println);

使用 BufferedReader.lines() 方法,将每行内容转成流。

BufferedReader reader = new BufferedReader(new FileReader("F:\\test_stream.txt"));
Stream<String> lineStream = reader.lines();
lineStream.forEach(System.out::println);

使用 Pattern.splitAsStream() 方法,将字符串分隔成流。

Pattern pattern = Pattern.compile(",");
Stream<String> stringStream = pattern.splitAsStream("a,b,c,d");
stringStream.forEach(System.out::println);

中间操作

Java 8Java 17 的版本中引入了大量新特性,极大地提升了 Java 的表达能力、性能以及开发效率。以下是这些版本中主要新特性的总结,适用于学习技术笔记。 ### 一、Java 8 新特性 Java 8 是一次重大更新,引入了许多现代编程语言的特性,主要包括: - **Lambda 表达式**:允许将函数作为参数传递,简化了集合操作并发编程。 - **函数式接口**:仅包含一个抽象方法的接口,支持 Lambda 表达式作为函数式编程的基础。 - **方法引用**:通过 `ClassName::methodName` 或 `object::methodName` 的形式直接引用已有方法。 - **默认方法**:接口中可以包含默认实现的方法,使用 `default` 关键字修饰,解决了接口演进问题。 - **静态方法**:接口中也可以定义静态方法,便于工具方法的封装。 - **Stream API**:提供声明式的集合操作方式,支持链式调用,如 `filter`、`map`、`reduce` 等。 - **Optional 类**:用于避免空指针异常,鼓励更安全的代码风格。 - **新的日期时间 API(java.time)**:引入 `LocalDate`、`LocalTime`、`LocalDateTime` 等类,替代旧版 `Date` `Calendar`,具有更好的线程安全性易用性 [^3]。 ```java // 示例:Stream API 与 Lambda 表达式 List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David"); List<String> filtered = names.stream() .filter(name -> name.startsWith("A")) .map(String::toUpperCase) .toList(); ``` ### 二、Java 9 新特性 Java 9 引入了模块化系统,并增强了工具链 API: - **模块系统(JPMS)**:通过 `module-info.java` 定义模块,提升大型系统的可维护性安全性。 - **JShell(REPL)**:提供交互式命令行,方便快速测试 Java 代码片段。 - **接口私有方法**:允许接口中定义 `private` 方法,用于辅助默认方法实现。 - **HTTP/2 客户端(实验性)**:引入新的 HTTP 客户端 API,支持同步异步请求 [^6]。 ### 三、Java 10 新特性 Java 10 增加了一些实用特性,提升开发效率: - **局部变量类型推断(var)**:允许使用 `var` 声明局部变量,编译器自动推断类型。 - **GC 改进**:引入并行 Full GC 的 G1 垃圾收集器。 - **统一垃圾回收接口**:为不同垃圾收集器提供统一接口,便于扩展 [^7]。 ```java // 示例:var 类型推断 var list = new ArrayList<String>(); list.add("Hello"); ``` ### 四、Java 11 新特性 Java 11 是一个长期支持版本(LTS),引入了多个增强功能: - **单文件源码执行(jshell-like)**:支持直接运行 `.java` 文件,无需显式编译。 - **HTTP Client API 增强**:支持同步异步请求,支持 WebSocket。 - **字符串增强方法**:如 `isBlank()`, `lines()`, `repeat(n)` 等。 - **文件读写新方法**:如 `Files.writeString()` `Files.readString()` [^8]。 ```java // 示例:Java 11 单文件执行 // 可以直接运行 java MyClass.java public class MyClass { public static void main(String[] args) { System.out.println("Hello from Java 11"); } } ``` ### Java 12-14 新特性 这几个版本继续引入语言工具链的小幅改进: - **Switch 表达式(Java 12/13)**:支持返回值简化语法,使用 `->` 替代 `:`。 - **文本块(Java 13)**:使用 `"""..."""` 定义多行字符串。 - **模式匹配(instanceof 类型匹配)(Java 14)**:简化类型判断与转换 [^9]。 ```java // 示例:switch 表达式 int numLetters = switch (day) { case MONDAY, FRIDAY, SUNDAY -> 6; case TUESDAY -> 7; case THURSDAY, SATURDAY -> 8; case WEDNESDAY -> 9; }; ``` ### 六、Java 15-17 新特性 这些版本进一步推进语言现代化性能优化: - **密封类(Sealed Classes)(Java 15/17)**:限制类或接口的继承关系,增强封装性。 - **移除实验性 AOT/JIT 编译器(Java 16)**。 - **记录类(Records)(Java 16)**:简化不可变数据类的定义。 - **模式匹配增强(Java 16)**:支持 `switch` 中的类型匹配。 - **强封装 JDK 内部 API(Java 16)**:限制访问内部 JDK 类。 - **Vector API(孵化阶段)(Java 16)**:支持 SIMD 指令优化。 - **结构化并发(Structured Concurrency)(Java 19)**:简化多线程编程模型(虽为 Java 19,但影响后续版本设计) [^10]。 ```java // 示例:record 类型 record Point(int x, int y) {} ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值