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 中的集合——不要错过!

Back to Blog

相关文章

阅读更多 »

Java 8(Stream API)

Stream API 的特性 - 声明式 – 使用函数式风格编写简洁且可读的代码。 - 惰性求值 – 只有在终端操作时才会执行操作……