JDK1.8,1.9新特性

320

java语言历史

版本号年份新特性
1.01996
1.11997JDBC
1.21998,Playground集合,字符串池
1.32000,Kestrel
1.42004,MerlinXML,正则,JDBC3.0,断言,NIO
5.02004,Tiger泛型,注解,可变参数,枚举
6.02006,Mustang脚本,JDBC4.0
7.02011,DolphinNIO 2,try-with-resources
8.02014.3接口更新,Lambda表达式,方法引用,Stream API,函数式接口,Hashorn,JavaFx,DateTime
9.02017.9Jigsaw模块化,Jshell,接口小更新

编程思想转换

  1. 二进制:101010
  2. 汇编语言
  3. 面向过程
  4. 面向对象
  5. 函数式编程思想

Lambda更优写法示例

  • 面向对象写法

    • Runnable task = new Runnable() {
              @Override
              public void run() {
                  System.out.printf("多线程任务执行啦!");
              }
          };
          new Thread(task).start();
      
  • 函数式编程写法

    • new Thread(() -> System.out.printf("线程任务执行啦")).start();
      

Lambda表达式的标准格式

  • 三要素
    • 一些参数
    • 一个箭头
    • 一些代码

如果参数有多个,那么使用逗号分隔;如果参数没有,则留空

箭头是固定写法

大括号其实就相当于是方法体。

Lambda表达式的省略规则

  1. 参数的类型可以省略,但是只能同时省略所有的参数类型,或者干脆都不省略,不能只写个别参数的类型。
  2. 如果参数有且仅有一个,那么小括号可以省略
  3. 如果大括号之内的语句有且仅有一个,那么无论有没有返回值,return,大括号和分号,都可以省略。

Lambda表达式得有上下文推导

  1. 根据调用方法的参数推导得知Lambda对应的接口
  2. 根据局部变量的赋值来推导得知Lambda对应的接口

函数式接口

接口当中有且仅有一个抽象方法。

@FunctionalInterface注解:用来检测一个接口是不是函数式接口,(使用类似于@Override)

@FunctionalInterface是可选的,就算不写这个注解,只要保证接口满足函数式接口的定义,照样是函数式接口

  1. 如果是函数式接口,那么编译通过。
  2. 如果不是函数式接口,那么编译失败。

Lambda注意事项

  • Lambda表达式并不是匿名内部类的语法糖
    • 语法糖:代码的写法更加简便,但其实原理不变 eg:
      • 方法中的可变参数,底层仍是一个数组
      • 增强for循环用于Iterable实现类型,底层仍然是一个迭代器
      • 自动装箱,自动拆箱
    • 所需的类型不一样:
      • 如果是匿名内部类,那么可以用接口,抽象类,普通类
      • 如果是Lambda表达式,那么必须是接口
    • 使用限制不一样
      • 如果接口当中有且仅有一个抽象方法,那么使用Lambda表达式,也可以使用匿名内部类
      • 如果接口当中抽象方法不唯一,那么是能使用匿名内部类,