前面示例中显式的lambda体只包含单个表达式.这种类型的lambda体被称为表达式体,具有表达式体的lambda表达式有时候被称为表达式lambda.在表达式中,lambda运算符右侧的代码必须包含单独一个表达式.尽管表达式lambda十分有用,但是有时候具体情况会要求使用一个以上的表达式.为了处理这种情况,Java支持另外一种类型的lambda表达式,其中运算符右侧的代码可以由一个代码块构成,其中可以包含多条语句.这种类型的lambda体称为块体(block body).具有块体的lambda表达式有时候被称为块lambda.
块lambda扩展了lambda表达式内部可以处理的操作类型,因为他允许lambda体包含多条语句,例如,在块lambda中,可以声明变量,使用循环,指定if和swtich语句,创建嵌套代码块等.创建块lambda很容易,只需要使用花括号包围lambda体,就像创建其他语句块一样.
除了允许多条语句,块lambda的使用方法与刚才讨论过的表达式lambda十分类似,但是,也有一个重要区别:在块lambda中必须显式使用一条return语句来返回值.必须这么做,因为块lambda体代表的不是单独一个表达式.
下面这个示例使用块lambda来计算并返回一个int类型值的最小正因子.他使用的接口为NumericFunc,该接口包含的方法func()接受一个int类型的实参并返回一个int类型的结果.因此,NumericFunc支持参数值和返回值都为int类型的数值函数:
public class test2 { public static void main(String args[]) { NumbericFunc smallerF = (n) -> { int result = 1; n = n < 0 ? -n : n; for(int i=2;i<=n/i;i++) { if(( n % i ) == 0) { result = i; break; } } return result; }; System.out.println("Smallest factor of 12 is "+smallerF.func(12)); System.out.println("Smallest factor of 11 is "+smallerF.func(11)); } } interface NumbericFunc { int func(int n); }
输出如下所示:
Smallest factor of 12 is 2 Smallest factor of 11 is 1
在该程序中,注意块lambda声明了一个变量result,使用了一个for循环,并且具有一条return语句.在块lambda体内,这么做是合法的.块lambda体在本质上与方法体类似.另外一点:当lambda表达式中出现return语句时,只是lambda体中返回,而不会导致包围lambda体的方法返回.