Java-8(最大的转变)
发布: (2025年12月17日 GMT+8 16:32)
2 min read
原文: Dev.to
Source: Dev.to
Lambda 表达式(第 1 部分)
在 Java 中,即使是写一小段逻辑也会很冗长,因为我们每次都必须创建一个匿名类并覆盖它的方法。Java 8 通过引入 lambda 表达式 解决了这个问题——这是一种简洁、清晰、函数式风格的代码写法。
基本语法
// No‑parameter lambda
() -> System.out.println("HI");
// Single‑parameter lambda
x -> x * x;
// Two‑parameter lambda
(x, y) -> x * y;
// Lambda with a block body
x -> {
int y = x + 1;
return y;
};
// No‑parameter lambda with a block body
() -> {
System.out.println("HI");
}
Java 8 之前
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Running");
}
}).start();
Java 8 之后
new Thread(() -> System.out.println("Running")).start();
捕获变量
规则: 被捕获的变量必须是 事实上 final。
int processedCount = 0;
orders.forEach(order -> {
processedCount++; // ❌ ERROR
});
在封闭作用域中定义的局部变量
processedCount必须是 final 或事实上 final。
修复 1:使用 AtomicInteger
AtomicInteger processedCount = new AtomicInteger(0);
orders.forEach(order -> {
processedCount.incrementAndGet(); // ✔ Works
});
System.out.println(processedCount.get());
AtomicInteger 是一个对象;引用是 final 的,但其内部值可以改变。
修复 2:使用数组包装器
int[] processedCount = {0};
orders.forEach(order -> {
processedCount[0]++; // ✔ Works
});
数组引用是 final 的,而其元素可以被修改。
修复 3:使用 Stream 的 count
long processedCount = orders.stream().count();
希望这能帮助你更好地理解 Java 8。下一篇博客我们将深入探讨 Java 8 中的集合——不要错过!