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<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 :内部自定义变量
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前段时间一直在看lambda表达式,但是总感觉吃不透,在深入了解lambda表达式的时候,需要很多基础的知识栈。这...
    西瓜真好吃丶阅读 2,744评论 0 7
  • 注:之前关于Java8的认知一直停留在知道有哪些修改和新的API上,对Lambda的认识也是仅仅限于对匿名内部类的...
    mualex阅读 2,846评论 1 4
  • 引言 在实际的项目中遇到一个问题,我们经常在网上搜索复制粘贴,其中有些代码看着非常的简洁,比如Lambda表达式,...
    编程小世界阅读 534评论 0 1
  • C++ lambda表达式与函数对象 lambda表达式是C++11中引入的一项新技术,利用lambda表达式可以...
    小白将阅读 85,412评论 15 117
  • 记得在《我家那闺女》节目里姚姗姗曾说这么多年自己一直忙着演戏,却不了解真实的生活,跟个傻子似的。出门竟带着现金,出...
    沐容心阅读 261评论 0 0