JDK8之Lambda表达式

Lambda表达式

Lambda表达式介绍

 Java8最值得学习的特性就是Lambda表达式和Stream API,如果有python或者javascript的语言基础,对
理解Lambda表达式有很大帮助,因为Java正在将自己变的更高(Sha)级(Gua),更人性化。--------可以这么说
lambda表达式其实就是实现SAM接口的语法糖。
 lambda写的好可以极大的减少代码冗余,同时可读性也好过冗长的内部类,匿名类。

举例:

lambda表达式语法

//一般语法
(Type1 param1, Type2 param2, ..., TypeN paramN) -> {
statment1;
statment2;
//.............
return statmentM; }
这是lambda表达式的完全式语法,后面几种语法是对它的简化。
//单参数语法
param1 -> {
statment1;
statment2;
//.............
return statmentM; }当lambda表达式的参数个数只有一个,可以省略小括号;
案例:
List<String> proNames = Arrays.asList(new String[]{"Ni","Hao","Lambda"});
List<String> lowercaseNames1 = proNames.stream().map(
name -> {return name.toLowerCase();}).collect(Collectors.toList());
//单语句写法
param1 -> statment
当lambda表达式只包含一条语句时,可以省略大括号、return和语句结尾的分号;
案例:
List<String> proNames = Arrays.asList(new String[]{"Ni","Hao","Lambda"});
List<String> lowercaseNames2 = proNames.stream().map(
name -> name.toLowerCase()).collect(Collectors.toList());

lambda表达式中的this概念

在lambda中,this不是指向lambda表达式产生的那个SAM对象,而是声明它的外部对象。
例如:
public class WhatThis {
public void whatThis(){
//转全小写
List<String> proStrs = Arrays.asList(new String[]{"Ni","Hao","Lambda"});
List<String> execStrs = proStrs.stream().map(
str -> {
System.out.println(this.getClass().getName());
return str.toLowerCase();
 }).collect(Collectors.toList());
execStrs.forEach(System.out::println);
 }
public static void main(String[] args) {
WhatThis wt = new WhatThis();
wt.whatThis();
 }
}
输出:
com.wzg.test.WhatThis
com.wzg.test.WhatThis
com.wzg.test.WhatThis
ni
hao
lambda

Lambda中参数的使用

lambda表达式可以访问给它传递的变量,访问自己内部定义的变量,同时也能访问它外部的变量。
不过lambda表达式访问外部变量有一个非常重要的限制:变量不可变(只是引用不可变,而不是真正的不可变)。
当在表达式内部修改waibu = waibu + " ";时,IDE就会提示你:
Local variable waibu defined in an enclosing scope must be final or effectively final
编译时会报错。因为变量waibu被lambda表达式引用,所以编译器会隐式的把其当成final来处理。
以前Java的匿名内部类在访问外部变量的时候,外部变量必须用final修饰。现在java8对这个限制做了优化,可以不
用显示使用final修饰,但是编译器隐式当成final来处理。
//举例
String waibu = "lambda :";
List<String> proStrs = Arrays.asList(new String[]{"Ni","Hao","Lambda"});
List<String>execStrs = proStrs.stream().map(
chuandi -> {
Long zidingyi = System.currentTimeMillis();
return waibu + chuandi + " -----:" + zidingyi;
 }
 ).collect(Collectors.toList());
execStrs.forEach(System.out::println);
输出:
lambda :Ni -----:1474622341604
lambda :Hao -----:1474622341604
lambda :Lambda -----:1474622341604
变量waibu :外部变量
变量chuandi :传递变量
变量zidingyi :内部自定义变量

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值