美文网首页程序员
java8新特性之lambda表达式

java8新特性之lambda表达式

作者: 冒险小A | 来源:发表于2018-03-25 18:04 被阅读0次
    什么是语法糖:

    语法糖指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。往往给程序员提供了更实用的编码方式,有益于更好的编码风格,更易读。不过其并没有给语言添加什么新东西。

    Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁。当开发者在编写Lambda表达式时,也会随之被编译成一个函数式接口。就是使用Lambda语法来代替匿名的内部类,代码不仅简洁,而且还可读。lambda表达式就是一个典型的语法糖.实际会被翻译为对象式代码.

    用简单易懂的话说,lambda表达式就是将那些代码中一定的,必要的,不可变的一部分给省略掉了,省略掉的部分JVM根据上下文推断出来,简单示例如下:

    //没有用lambda表达式时
    public class LambdaDemo1 {
        public void oldCode() {
            new Thread() {
                public void run() {
                    System.out.println("hello lambda!");
                }
            }.start();
        }
    }
    //使用lambda表达式后
    public class LambdaDemo1 {
        public void oldCode() {
            new Thread(()->System.out.println("hello lambda!")).start();
        }
    }
    
    使用lambda表达式省略的部分

    可以看出,lambda表达式让代码更简略清晰,模拟了函数式编程的外观,但是翻译后底层还是会和原来一样.这也就是语法糖的作用了.


    lambda的历史: λ (波长单位), 这里指带有参数变量的表达式称为lambda表达式.

    lambda表达式的基本语法 :
    参数列表 -> 表达式
    
    参数列表:
    1. 如果没有参数;直接用()来表示;()不能省略.
    2. 如果只有一个参数,并且参数写了类型,参数外面一定要加().
    3. 如果只有一个参数,并且参数不写类型,那么这个参数外面可以不用加().
    4. 如果有两个或多个参数,不管是否写参数类型,都要加().
    5. 如果参数要加修饰符或者标签,参数一定要加上完整的类型.所以此时也要用().
    表达式:
    1. 如果表达式只有一行,那么可以直接写(不需要用{}).
    2. 如果只有单行的情况,并且方法需要返回值,此时不能有return,JVM会自动帮我们推导return.
    3. 如果表达式有多行,需要用{}变成代码块.
    4. 如果表达式是代码块,并且方法需要返回值,那么,在代码块中就必须返回一个返回值.

    lambda中的变量:
    1. 参数
    2. 局部变量.
    3. 自由变量(即除了它自己的参数和内部定义的局部变量).
      1)自由变量在lambda表达式中不能修改;
      2)参数和局部变量的使用方法和普通的变量使用方法相同;
      3)lambda表达式中的this指向"创建lambda表达式的方法中的this"

    在Java8以前,如果要在内部类访问外部对象的一个本地变量,那么这个变量必须声明为final才行。在Java8中,这种限制被去掉了,代之以一个新的概念,“effectively final”。它的意思是你可以声明为final,也可以不声明final但是按照final来用,也就是一次赋值永不改变。换句话说,保证它加上final前缀后不会出编译错误。 在Java8中,内部类和λ表达式都可以访问effectively final的本地变量。

    闭包:

    操作自由变量的代码块,称之为闭包,在java中,lambda表达式就是闭包,事实上,内部类一直都是闭包.

    相关文章

      网友评论

        本文标题:java8新特性之lambda表达式

        本文链接:https://www.haomeiwen.com/subject/cytkcftx.html