java 8 lambda表达式语法

lambda表达式可以这样定义:一段带有输入参数的可执行语句块。

 

Lambda语法详解

lambda表达式的一般语法:

 

(Type1 param1, Type2 param2, ..., TypeN paramN) -> {
      statment1;
      statment2;
      //.............
      return statmentM;
}

 

lambda表达式的各种简化版:

1. 参数类型省略–绝大多数情况,编译器都可以从上下文环境中推断出lambda表达式的参数类型。

 

(param1,param2, ..., paramN) -> {
      statment1;
      statment2;
      //.............
      return statmentM;
}

 

 

2. 当lambda表达式的参数个数只有一个,可以省略小括号。

 

param1 -> {
      statment1;
      statment2;
      //.............
      return statmentM;
}

 

3. 当lambda表达式只包含一条语句时,可以省略大括号、return和语句结尾的分号。

 

param1 -> statment

 

Lambda表达式眼中的外部世界

Lambda表达式可以访问给它传递的参数,也能自己内部定义变量。但是却从来没看到其访问它外部的变量。是不是lambda表达式不能访问其外部变量?我们可以这样想:lambda表达式其实是快速创建SAM接口的语法糖,原先的SAM接口都可以访问接口外部变量,lambda表达式肯定也是可以。

 

String[] array = {"a", "b", "c"};
for(Integer i : Lists.newArrayList(1,2,3)){
   Stream.of(array).map(item -> Strings.padEnd(item, i, '@')).forEach(System.out::println);
}

 

上面的这个例子中,map中的lambda表达式访问外部变量Integer i。并且可以访问外部变量是lambda表达式的一个重要特性,这样我们可以看出来lambda表达式的三个重要组成部分:

 

  • 输入参数
  • 可执行语句
  • 存放外部变量的空间

不过lambda表达式访问外部变量有一个非常重要的限制:变量不可变(只是引用不可变,而不是真正的不可变)。

String[] array = {"a", "b", "c"};
for(int i = 1; i<4; i++){
   Stream.of(array).map(item -> Strings.padEnd(item, i, '@')).forEach(System.out::println);
}

上面的代码,会报编译错误。因为变量i被lambda表达式引用,所以编译器会隐式的把其当成final来处理。细心的读者肯定会发现不对啊,以前java的匿名内部类在访问外部变量的时候,外部变量必须用final修饰。Bingo,在 java8对这个限制做了优化,可以不用显示使用final修饰,但是编译器隐式当成final来处理。

 

在lambda中,this不是指向lambda表达式产生的那个SAM对象,而是声明它的外部对象。

 

http://ifeve.com/lambda/

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值