大括号 {} 在 lambda 表达式中仅当函数体为单条语句且无 return 时可省略,此时 return 和分号也必须一并省略;多语句、变量声明或需显式返回时必须保留 {}。

大括号 `{}` 在 Lambda 表达式中能否省略,取决于函数体的语句数量和返回逻辑,不是随意删减,而是有明确规则的。
只有一条语句时才能省略大括号
当 Lambda 的函数体仅包含一条可执行语句(表达式或语句),且该语句不带 `return` 语句(或本身就是返回值表达式)时,大括号可以省略。
-
能省略:
x -> x * 2(单表达式,隐式返回) -
能省略:
s -> System.out.println(s)(单条语句,无返回值) -
不能省略:
x -> { System.out.println("计算中"); return x * 2; }(两条语句,必须加 `{}`) -
不能省略:
(x, y) -> { int sum = x + y; return sum > 10; }(含变量声明+逻辑判断,多语句)
省略大括号时,return 和分号也必须一并省略
这是硬性配套规则:大括号 `{}`、`return` 关键字、末尾分号三者必须同时存在或同时省略。
- ✅ 正确省略:
x -> x + 1(无 `{}`、无 `return`、无分号) - ❌ 错误混用:
x -> return x + 1;(缺 `{}` 却保留 `return` 和 `;`,编译报错) - ❌ 错误混用:
x -> { x + 1 }(有 `{}` 却没 `return`,且无分号,编译失败)
有返回值时,单表达式可隐式返回
当函数体是单一表达式(如算术运算、方法调用、对象构造等),且目标函数式接口的抽象方法有返回值类型,Java 会自动将其作为返回值。
-
Function<string integer> len = s -> s.length()</string>✅ 等价于s -> { return s.length(); } -
Predicate<integer> isEven = n -> n % 2 == 0</integer>✅ 不需要 `return` 或 `{}` - 但若写成
n -> { n % 2 == 0 }❌ 缺少 `return`,实际返回 `void`,类型不匹配
无返回值场景(Consumer 等)更需注意语句性质
对于 `void` 返回的方法(如 `Consumer.accept()`),函数体只能是语句(如 `System.out.println(...)`),不能是纯表达式。
- ✅
Consumer<string> printer = s -> System.out.println(s)</string>(单条语句,可省 `{}`) - ❌
Consumer<string> printer = s -> s.toUpperCase()</string>(表达式无副作用,不打印也不赋值,编译通过但逻辑无效) - ⚠️ 若需多操作,如先转大写再打印,必须写成:
s -> { String upper = s.toUpperCase(); System.out.println(upper); }
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











