JDK8之Lambda表达式

Lambda表达式

Lambda表达式介绍

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

举例:

Lambda表达式1.png

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表达式)