赞
踩
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 :内部自定义变量
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。