Java 新特性

10 阅读4分钟

Java 8 (2014年发布)

Java 8 是一个里程碑版本,带来了许多重大特性:

1. Lambda 表达式

简化了匿名内部类的写法,支持函数式编程。
语法

(参数) -> { 方法体 }

示例

List<String> list = Arrays.asList("A", "B", "C");
list.forEach(s -> System.out.println(s));

2. 函数式接口 (Functional Interface)

使用 @FunctionalInterface 注解标识一个只有一个抽象方法的接口。


3. Stream API

用于集合的处理,提供了函数式编程风格的操作。
示例

List<String> list = Arrays.asList("A", "B", "C");
list.stream()
    .filter(s -> s.startsWith("A"))
    .forEach(System.out::println);

4. 默认方法 (Default Methods)

接口中可以有带实现的默认方法。
示例

interface MyInterface {
    default void sayHello() {
        System.out.println("Hello, World!");
    }
}

5. Optional 类

用于避免 NullPointerException
示例

Optional<String> optional = Optional.ofNullable(null);
optional.ifPresent(System.out::println);

6. 新的日期时间 API

引入 java.time 包,替代旧的 DateCalendar 类。
示例

LocalDate today = LocalDate.now();
System.out.println(today);

Java 9 (2017年发布)

1. 模块化系统 (Project Jigsaw)

引入模块系统,将 JDK 分为多个模块,提高了性能和安全性。
模块声明

module my.module {
    requires java.base;
    exports com.example.myapp;
}

2. JShell (交互式 REPL)

提供了一个命令行工具,可以直接运行 Java 代码。
示例

jshell> System.out.println("Hello, Java 9!");
Hello, Java 9!

3. 增强的 Stream API

增加了 takeWhiledropWhile 等新方法。
示例

List<Integer> list = List.of(1, 2, 3, 4, 5);
list.stream()
    .takeWhile(n -> n < 4)
    .forEach(System.out::println);

4. 私有接口方法

接口中可以定义私有方法,用于代码复用。
示例

public interface MyInterface {
    default void sayHello() {
        say("Hello");
    }

    private void say(String message) {
        System.out.println(message);
    }
}

Java 10 (2018年发布)

1. 局部变量类型推断 (var)

使用 var 声明局部变量,自动推断类型。
示例

var list = new ArrayList<String>();
list.add("Hello");
System.out.println(list);

2. 垃圾回收器优化

引入 G1 垃圾回收器改进,默认的 GC 为 G1。


Java 11 (2018年发布)

1. 新的字符串方法

增加了 isBlanklinesstriprepeat 等方法。
示例

String str = " Hello ";
System.out.println(str.strip());   // 去除首尾空白
System.out.println("a".repeat(3)); // 输出 aaa

2. HTTP Client API

标准化了新的 HTTP 客户端 API。
示例

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://example.com"))
    .GET()
    .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());

Java 12-21 新特性概览

  • Switch 表达式 (Java 12, 14):增强 switch,支持表达式返回值。
  • Records (Java 16):简化数据模型类的创建。
  • Text Blocks (Java 15):简化多行字符串编写。
  • Sealed 类 (Java 17):允许指定哪些类可以继承。
  • 虚拟线程 (Java 19):提高高并发应用性能。
  • 模式匹配 (Java 16-21):增强类型检查和转换。

总结

Java 从 8 开始引入了许多关键的新特性,如 Lambda 表达式Stream API,大大提升了开发效率。后续版本不断加强模块化、类型推断、以及现代化工具,逐步向高效并发和易用性靠随。

扩展:NIO 技术

Java NIO(New Input/Output)是 Java 1.4 中引入的新 I/O API,用于替代传统的 Java IO,提供了更高效的输入/输出操作。NIO 通过 缓冲区(Buffer)通道(Channel) 的概念,实现了非阻塞 I/O 操作和多路复用。

NIO 核心组件

  1. Buffer(缓冲区)

    • 用于存储数据,NIO 中的数据读写是通过 Buffer 来完成的。
    • 常用的缓冲区类型包括:
      • ByteBuffer(字节缓冲区)
      • CharBuffer(字符缓冲区)
      • IntBuffer(整数缓冲区)
      • DoubleBuffer(双精度浮点缓冲区)
    • 主要方法:
      • put():向缓冲区中写入数据。
      • get():从缓冲区中读取数据。
      • flip():将缓冲区从写模式切换到读模式。
      • clear():清空缓冲区。
  2. Channel(通道)

    • Channel 是双向的,既可以进行读操作,也可以进行写操作。
    • 常用的通道包括:
      • FileChannel:用于文件读写。
      • SocketChannel:用于 TCP 网络读写。
      • ServerSocketChannel:用于监听 TCP 连接。
      • DatagramChannel:用于 UDP 数据传输。
    • 通道和缓冲区配合使用,通过 read()write() 方法进行数据传输。
  3. Selector(选择器)

    • Selector 是 NIO 中实现非阻塞 I/O 的核心组件,用于监听多个通道的事件(例如:连接、读、写等)。
    • 通过 Selector 可以实现单线程管理多个通道,避免传统 I/O 中多线程的性能开销。
    • 常用方法:
      • select():阻塞直到有通道就绪。
      • selectNow():非阻塞地获取就绪的通道。
      • selectedKeys():获取就绪通道的集合。

NIO 非阻塞特性

  • 传统 I/O 是阻塞的,线程在执行读写操作时会被阻塞,直到操作完成。
  • NIO 通过 SelectorChannel 实现非阻塞 I/O,线程可以继续执行其他任务,而不会因 I/O 操作而被阻塞。

NIO 示例代码

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;

public class NIOClient {
    public static void main(String[] args) {
        try {
            // 打开一个 SocketChannel
            SocketChannel socketChannel = SocketChannel.open();
            // 配置为非阻塞模式
            socketChannel.configureBlocking(false);
            // 连接到服务器
            socketChannel.connect(new InetSocketAddress("localhost", 8080));

            while (!socketChannel.finishConnect()) {
                System.out.println("正在连接服务器...");
            }

            // 创建一个缓冲区
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            buffer.put("Hello, NIO Server!".getBytes());
            buffer.flip();

            // 写入数据到通道
            socketChannel.write(buffer);
            buffer.clear();

            socketChannel.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

NIO 的优点

  1. 非阻塞 I/O:提升系统性能,适合处理高并发场景。
  2. 更少的线程开销:通过 Selector 管理多个通道,减少线程数量。
  3. 高效的数据传输:通过缓冲区进行批量数据传输。

适用场景

  • 高并发网络服务器,例如:聊天室、HTTP 服务器。
  • 文件传输或大数据处理应用。