JDK新特性文字版

接口

在jdk1.8前

  • 常量和抽象方法
  • 成员都是公共的,修饰也是固定的
  • 实现类必须实现所有抽象方法,否则还是抽象方法

在jdk1.8后

  • 允许有带有方法体和方法

  • 默认方法

    • default修饰

      • 1、实现类可重写,也可不重写
      • 2、实现类中可以直接调用默认方法
      • 3、重写了默认方法,调用接口中的默认方法,接口名.super.默认方法名()
      • 4、实现类实现了多个接口,接口中有相同的方法定义,实现类必须重写该方法
      • 5.一个类继承了一个父类并实现了接口,父类和父接口中有相同的默认方法,优先找类
        这样定义接口,发现接口与抽象类越来越像,因此接口有要替代抽象类的趋势。
        因此类和类是继承,耦合度高,接口和类是实现关系,耦合度要低。
  • 静态方法

    • static修饰

      • 接口名.静态方法名
      • 静态方法不被实现类实现,因此实现类不能调用
      • 静态方法只能访问静态,非静态即可以访问静态也可以访问非静态

jdk9.0

  • 接口中可有私有方法
  • 只能在接口内部使用,外部其他类不能使用

Lambda表达式

概念

  • Lambda表达式最终也会有一个值。实际就是一个匿名实现类的对象,也就是匿名内部类的简写格式,也可以当做一个数据直接进行传递。

好处

  • 代码简洁,效率高(不会有对应的class文件去创建)

前提

  • 接口是一个函数式接口,即接口中只有一个抽象方法,(默认方法和静态方法不考虑)

  • 判断是否是函数式接口,在接口上方添加注解

    • @FunctionalInterface

格式

  • (参数列表) -> {方法体语句;};

  • {参数列表}:接口中的抽象方法的参数列表

  • ->

    • Lambda表达式的固定符号
  • {方法体语句;};

    • 接口中抽象方法的具体实现代码

案例

  • 方法无参数,无返回值

    • Runnable run = () -> System.out.println("run");
  • 方法有参数,无返回值

    • Consumer con = (String s) -> System.out.println(s.length());
      con.accept("123");
    • Consumer con = s -> System.out.println(s.length());
    • 说明:箭头左侧,参数列表的类型和小括号可以省略
      前提是只有能有一个参数
  • 有返回值,无参数

    • Callable call = () -> {return "hello";};
    • Callable call = () -> "hello";
    • 说明:箭头右边,有且只有一行,可以省略大括号
      这一行中有return,那么就将return和大括号一起省略。
  • 有返回值,有参数

    • Comparator com = (Integer i1,Integer i2) -> Integer.compare(i1,i2);
    • Comparator com = (i1,i2) -> Integer.compare(i1,i2);
    • 说明:箭头左侧,参数列表的类型可以省略

总结

  • 左右各为一时,可以省略对应括号
  • 左侧的参数类型可以省略,注没有小括号不能省略
  • 右侧语句大于等于2的时不能省略大括号
  • 有return,并只有一条语句,那么return和大括号一起省略

函数式接口

核心函数式接口

  • java.util.function包

消费型接口

  • Consumer

    • void accept(T t):对t进行处理操作,操作完成后就结束
  • 打印字符串长度

    • Consumer consumer = s -> System.out.println(s.length);
    • consumer.accept("123131");

函数型(功能型)接口

  • Function<T,R>

    • R apply(T t):对t进行各种计算,最终得到一个R类型的结果
  • 将字符字符串转成小写

    • Function<String,String> fun = s -> s.toLowerCase();
    • System.out,println(fun.apply("QFFAAD"));

断言型接口

  • Predicate

    • boolean test(T t):对t进行各种判断,最终得到一个boolean类型的结果
  • 判断字符串长度是否大于5

    • Predicate pre = s -> s.length() > 5;
    • System.out.println(pre.test("2313123"));

供给型接口

  • Supplier

    • T get():返回T类型数据
  • 返回字符串abc

    • Supplier sup = () -> "abc";
    • System.out.println(sup.get());

方法引用

Lambda表达式的简写格式

格式

  • 对象名 :: 实例方法名

    • Consumer con = s -> System.out.println(s);
    • Consumer con1 = System.out::println;
    • con.accept("123");
    • con1.accept("123");
  • 类名 :: 静态方法名

    • Comparator com = (x, y) -> Integer.compare(x,y);
    • Comparator com1 = Integer::compare;
    • System.out.println(com.compare(1,5));
    • System.out.println(com1.compare(1,5));
    • 特点:接口中方法的参数列表和返回值类型 与 引用方法的参数列表和返回值相同。
  • 类名 :: 实例方法名

    • BiPredicate<String,String> bip = (s1,s2) -> s1.startsWith(s2);
    •     BiPredicate<String,String> bip1 = String::startsWith;
      
    •     System.out.println(bip.test("abc","a"));
      
    •     System.out.println(bip1.test("abc","a"));
      
    • 特点:接口中方法的参数列表中的参数,第一个作为引用方法的调用者的第二个作为引用方法的参数。
  • 构造引用

    • 类名 :: new

      • Supplier sup = () -> new Person();
      •     Supplier<Person>  sup1 = Person :: new;
        
      •     System.out.println(sup1.get());
        
      • 特点:接口中方法的参数列表要与构造方法的参数列表一致
  • 数组引用

    • 元素类型[] :: new

      • Function<Integer,Character[]> fun2 = x -> new Character[x];
      • Function<Integer,Character[]> fun3 = Character[] :: new;
      • System.out.println(fun3.apply(5).length);

StreamAPI

作用:可以对数据源进行想要的计算,比如:过滤、去重复..,最终返回的是一个新的Stream。

特点

  • 1、不改变数据源,得到新的Stream
  • 2、可以对数据源及逆行一系列流水线似的操作
  • 3、是一个惰性求值,只有看到终止命令才进行一系列的流水线计算
  • 4、数据源是:数据或集合
  • 5、数据源是存储数据的,而Stream是用来做计算的
  • 6、Stream一旦执行了终止操作,Stream不可以再使用

步骤

  • 1、获取Stream对象

  • 2、一系列流水线似的操作(方法)

  • 3、终止操作

    • 可以无第二步
    • 无第三步,不做计算

获取Stream对象

  • java.util.stream包
  • Collection.stream()
  • Arrays.stream()
  • Stream.of()
  • Map.keySet().stream()
  • Map.values().stream()
  • Map.entrySet().stream()

中间操作

  • filter(Predicate):过滤

    • 获取到Stream对象,相当于有了数据源中的所有数据,每个数据会进行filter计算
      符合就要,不符合不要,因此得到的新的Stream中存储的就是满足要求的数据
  • distinct():去重

  • map(Function):对数据运行function的计算操作

  • limit(int num)

    • 限制结果集个数,从开始到指定
  • skip(int num)

    • 从num-末尾个处理,
      跳过至指定条数
  • sorted()

    • 排序,按自然顺序
  • sorted(比较器)

    • 按照比较器顺序

终止方法

  • forEach(Consumer)

  • count()

    • 统计个数
  • collect(Collctor)

    • 收集
posted @ 2021-07-27 22:49  Lucky_龍  阅读(49)  评论(0)    收藏  举报