块lambda表达式

前面示例中显式的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体的方法返回.