zoukankan      html  css  js  c++  java
  • java8新特性

    java8新特性
    一、java8有哪些新特性
    lambda表达式
    函数式接口
    默认方法 (接口中定义default方法)
    方法引用


    接口中的默认方法出现的好处?
    不用修改实现类的情况下, 功能的增强

    Java8的明显特点是通过默认接口定义、Lambda表达式、方法引用、函数式接口带来了函数式编程

    1.java8中的接口现在支持声明方法的同时提供实现,通过两种方式可以完成
    (1)接口内声明静态方法
    调用通过接口名.方法名
    (2)接口内声明默认方法
    默认方法可以被重写
    调用通过接口名.super.方法名

    2.函数式编程
     以函数思维做为核心,在这种思维的角度去思考问题,最重要的基础是函数的输入和输出
      使用不可变值和函数,【函数对一个值进行处理,映射成另一个值】

    3.函数式接口
    只定义【一个抽象方法】的接口
        只能有一个抽象方法
        可以有静态方法和默认方法,因为这两种方法都是已经实现的了
        可以包含Object里所有能重写的方法,因为即使接口包含像String toString()这样的抽象方法,它的实现类也会因继承了Object类,而再次对接口中的toString()方法进行实现。
    注:哪怕有很多默认方法,只要接口只定义了一个抽象方法,它就仍然是一个函数式接口。

    (1)函数式接口的作用
    方便直接用Lambda表达式构造出实例,让代码更加简洁
    Lambda表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例。
    你用匿名内部类也可以完成同样的事情,只不过比较笨拙。
    Comparator<String> c = new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o2.length()-o1.length();
            }
        };
    //函数式编程 : 参数+返回值
        Comparator<String> d = (o1,o2)->o2.length()-o1.length();
    (2) 函数描述符
        函数式接口中的抽象方法的名基本上就是Lambda表达式的名,我们将这种抽象方法叫作函数描述符。
        () -> {}
        参数列表可以写类型 可以不写类型


    (3)声明函数式接口 @FunctionalInterface
        这个标注用于表示该接口会设计成一个函数式接口

    4.lambda表达式
    它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。
       (参数列表)->{return 返回值}
       
    lambda中变量的问题:
    lambda中可以使用成员变量,局部变量,但是使用过局部变量以后,该局部变量就必须为final,所以不能再修改了。

    (1)不需要声明参数类型,编译器可以统一识别参数值。
    (2)一个参数无需定义圆括号,但多个参数需要定义圆括号。
    (3)lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改
    (4)在lambda表达式不允许声明与全局变量相同的局部变量、参数。

    5.四大函数式接口
     Predicate<T>:断言型接口
    //接收一个对象,返回boolean型结果。
    //将满足条件的字符串 ,放入集合中去
    boolean test(T t);
     public class LambdaTest4 {
                public static void filter(List<String> languages, Predicate<String> condition) {  
                    for(String name: languages) {  
                       if(condition.test(name)) {  
                          System.out.println(name + " ");  
                       }  
                    }  
                }  
                public static void main(String[] args) {
                   List<String> languages = Arrays.asList("Java", "html5","JavaScript", "C++", "hibernate", "PHP");
                   
                   //开头是J的语言
                   filter(languages,(String name)->name.startsWith("J"));
                   //5结尾的
                   filter(languages,(String name)->name.endsWith("5"));
                   
                   //所有的语言
                   filter(languages,(name)->true);
                   //一个都不显示
                   filter(languages,(name)->false);
                   //显示名字长度大于4
                   filter(languages,(name)->name.length()>4);
                   System.out.println("-----------------------");
                   //名字以J开头并且长度大于4的
                   Predicate<String> c1 = (name)->name.startsWith("J");
                   Predicate<String> c2 = (name)->name.length()>4;
                   filter(languages,c1.and(c2));
    }
     
    Function<T,R>:函数型接口
    R apply(T t);     有参数有返回值
    //表示接收一个参数并产生结果的函数


    Consumer<T>:消费型接口
    void accept(T t);有参数没有返回值

    Supplier<T>:供给型接口
    T get();没参数有返回值


    4.java常用的函数式编程接口
    1.比较器
    2.实现线程
    3.绑定事件
    4.集合数据排序

    比较苹果的重量
    // 3、使用Lambda表达式
    inventory.sort((a, b) -> a.getWeight() - b.getWeight());

    // 4、使用Comparator的comparing
    Comparator<Apple> comparing = comparing((Apple a) -> a.getWeight());
    inventory.sort(comparing((Apple a) -> a.getWeight()));
    //或者等价于
    inventory.sort(comparing(Apple::getWeight));



  • 相关阅读:
    LOJ #6183 看无可看
    BZOJ 5467 Slay the Spire
    BZOJ 5306 [HAOI2018] 染色
    BZOJ 2784 时间流逝
    BZOJ4911: [Sdoi2017]切树游戏
    min-max 容斥
    BZOJ 5475: [WC 2019] 数树
    BZOJ 2810 [Apio2012]kunai
    Codeforces round 1083
    详解大数据数据仓库分层架构
  • 原文地址:https://www.cnblogs.com/yxj808/p/12014752.html
Copyright © 2011-2022 走看看