JDK8之Lambda表达式

Lambda表达式

Lambda表达式介绍

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

举例:

JDK8之Lambda表达式_第1张图片

lambda表达式语法

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

lambda表达式中的this概念

在lambda中,this不是指向lambda表达式产生的那个SAM对象,而是声明它的外部对象。
例如:
public class WhatThis {
public void whatThis(){
//转全小写
List proStrs = Arrays.asList(new String[]{"Ni","Hao","Lambda"});
List 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 proStrs = Arrays.asList(new String[]{"Ni","Hao","Lambda"});
ListexecStrs = 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 :内部自定义变量

 

你可能感兴趣的:(JDK8之Lambda表达式)