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 的这些"配角"特性,用对了同样能提升代码质量。
