当前位置:   article > 正文

JDK8之Lambda表达式_jdk8 lamada 表达式

jdk8 lamada 表达式

Lambda表达式

Lambda表达式介绍

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

举例:

lambda表达式语法

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

lambda表达式中的this概念

  1. 在lambda中,this不是指向lambda表达式产生的那个SAM对象,而是声明它的外部对象。
  2. 例如:
  3. public class WhatThis {
  4. public void whatThis(){
  5. //转全小写
  6. List<String> proStrs = Arrays.asList(new String[]{"Ni","Hao","Lambda"});
  7. List<String> execStrs = proStrs.stream().map(
  8. str -> {
  9. System.out.println(this.getClass().getName());
  10. return str.toLowerCase();
  11. }).collect(Collectors.toList());
  12. execStrs.forEach(System.out::println);
  13. }
  14. public static void main(String[] args) {
  15. WhatThis wt = new WhatThis();
  16. wt.whatThis();
  17. }
  18. }
  19. 输出:
  20. com.wzg.test.WhatThis
  21. com.wzg.test.WhatThis
  22. com.wzg.test.WhatThis
  23. ni
  24. hao
  25. lambda

Lambda中参数的使用

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

 

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/726750
推荐阅读
相关标签
  

闽ICP备14008679号