Skip to content

JDK 8 其他特性

Lambda 和 Stream 固然耀眼,但 JDK 8 的改进远不止于此。

这一节聊聊那些容易被忽略、但同样实用的新特性。

Base64 编码

什么时候需要 Base64

常见场景:
✅ 图片转 Base64(Data URL)
✅ 发送邮件附件
✅ 传输二进制数据(如文件加密后)
✅ URL 编码(部分实现)
✅ OAuth 的 token 传输

基本用法

java
import java.util.Base64;

public class Base64Demo {

    public static void main(String[] args) {
        String original = "Hello World! 你好世界!";

        // 编码
        String encoded = Base64.getEncoder().encodeToString(original.getBytes());
        System.out.println("Encoded: " + encoded);
        // Output: SGVsbG8gV29ybGQhIOS4l+WQjSE=

        // 解码
        byte[] decodedBytes = Base64.getDecoder().decode(encoded);
        String decoded = new String(decodedBytes);
        System.out.println("Decoded: " + decoded);

        // URL 安全编码(替换 +/= 为 -_.)
        String urlEncoded = Base64.getUrlEncoder()
            .withoutPadding()
            .encodeToString(original.getBytes());
        System.out.println("URL Encoded: " + urlEncoded);
    }
}

MIME 编码

java
// MIME 格式:每行 76 字符,带换行
String original = "a".repeat(100);
String mimeEncoded = Base64.getMimeEncoder().encodeToString(original.getBytes());
System.out.println(mimeEncoded);

并行数组操作

JDK 8 为 Arrays 添加了并行版本,充分利用多核 CPU。

parallelSort — 并行排序

java
import java.util.Arrays;

public class ParallelSortDemo {

    public static void main(String[] args) {
        int[] array = new int[10_000_000];
        Arrays.setAll(array, i -> (int)(Math.random() * 1_000_000));

        // 串行排序
        long start1 = System.currentTimeMillis();
        Arrays.sort(array.clone());
        long time1 = System.currentTimeMillis() - start1;

        // 并行排序
        long start2 = System.currentTimeMillis();
        Arrays.parallelSort(array.clone());
        long time2 = System.currentTimeMillis() - start2;

        System.out.println("串行: " + time1 + "ms");
        System.out.println("并行: " + time2 + "ms");
    }
}

何时用 parallelSort

java
// ✅ 大数据量(> 10,000 元素)推荐
Arrays.parallelSort(hugeArray);

// ⚠️ 小数据量反而可能更慢(线程开销)
Arrays.parallelSort(smallArray);  // 可能比 sort 慢

// ✅ 自定义比较器
String[] names = {"Alice", "Bob", "Charlie"};
Arrays.parallelSort(names, String::compareToIgnoreCase);

其他并行方法

java
int[] array = new int[1000];
Arrays.setAll(array, i -> i);  // 串行

// JDK 8+ 并行设置
Arrays.parallelSetAll(array, i -> i * 2);

// JDK 8+ 并行前缀
int[] prefix = {1, 2, 3, 4, 5};
Arrays.parallelPrefix(prefix, Integer::sum);
// 结果: [1, 3, 6, 10, 15]

StringJoiner

拼接字符串的优雅方式。

基础用法

java
import java.util.StringJoiner;

public class StringJoinerDemo {

    public static void main(String[] args) {
        // 基础拼接
        StringJoiner sj = new StringJoiner(", ");
        sj.add("Java");
        sj.add("Python");
        sj.add("Go");
        System.out.println(sj.toString());  // "Java, Python, Go"

        // 带前缀和后缀
        StringJoiner sj2 = new StringJoiner(", ", "[", "]");
        sj2.add("A").add("B").add("C");
        System.out.println(sj2.toString());  // "[A, B, C]"
    }
}

与 Stream 结合

java
import java.util.stream.Collectors;
import java.util.List;

List<String> languages = List.of("Java", "Kotlin", "Scala");

// ❌ 旧方式
String result1 = String.join(", ", languages);

// ✅ 新方式(带前缀后缀)
String result2 = languages.stream()
    .collect(Collectors.joining(", ", "[", "]"));
// "[Java, Kotlin, Scala]"

CompletableFuture

JDK 8 引入的异步编程利器——详见并发编程章节。

小结

特性适用场景
Base64编码解码二进制数据
parallelSort大数组排序
StringJoiner字符串拼接

JDK 8 的这些"配角"特性,用对了同样能提升代码质量。

基于 VitePress 构建