JDK1.8新特性 lambda表达式 局部内部类中的变量修饰符


jdk1.8新特性

1.Lambda表达式
    1.简介
        语法糖 也叫作糖衣语法
        指的是 在计算机语言中 添加某种语法
        这种语法 能使程序员更方便的使用语言开发程序
        同时,增强了代码的可读性 避免了出错的机会
        但是,这种语法对于语言的功能并没有增强
        
        泛型 <>
        自动装箱拆箱
        增强for循环
    2.Lambda表达式 λ
        本身就是数学的概念
        也叫作 目标类型(target type)
    3.语法格式
        基本格式
            (参数列表)->{方法体};
        解释:
            1. "->" 表示 转为/成为
                左边指定输入的参数 右边是Lambda的方法主体
            2.()形参列表 0个/N个
            3.{}是方法体语句
        注意:
            1. 只有是函数接口(当一个接口中 只包含一个方法时 该接口叫做函数接口) 才能使用Lambda表达式替换
        格式:
            ()->{}
            1.(参数列表)->表达式
              花括号可省略 省略后 不能书写return关键字
            2.形参列表的类型声明 可省略 java在编译的时候 会根据上下文 自动推断出参数类型
            3.小括号可省略 形参列表是一个的时候可省略
            4.return关键字
                如果是单一表达式 可不写
                如果写了return 就必须写花括号
    4.Lambda表达式的基本应用
        4.1 线程中的使用
        4.2 forEach方法在集合中的使用
            Iterable 1.8新增方法
                default void forEach(Consumer<? super T> action)
            Map 1.8新增方法
                default void forEach(BiConsumer<? super K,? super V> action)  
        4.3 集合的排序
            List集合出现自有的排序方法sort() 可根据Comparator比较器顺序进行排序
        4.4 数组的排序
        4.5 特殊的双冒号:: 方法引用
            这是java8的Lambda表达式写法 叫做方法引用 (method references)
            是Lambda的简写形式
            注意:
                1.是Lambda的简写形式
                2.调用一个已存在的方法
                3.当我们需要引用的方法传入其他类型参数的时候 不适合
            语法:
                左边是容器(类名/实例名) 
                中间::
                右边是要调用的方法名
            1.非静态方法调用
                对象的引用::方法名
                想要调用该对象所属类的一个已存在方法
                例如:
                    Object obj = new Object();
                    obj.equals(o2);
                    方法引用
                    obj::equals;

                    Person类 getName()方法
                    Person p = new Person();
                    p.getName();

                    Lambda写法
                    (Person p)->p.getName();
                    方法引用
                    p::getName;
            2.静态方法调用
                类名::方法名
                例如:
                    String.valueOf(i)
                    Lambda
                    (i)->String.valueOf(i);
                    简写模式
                    String::valueOf
            3.构造方法调用
                类名::new
                Student s = new Student();
                例如:
                    String s = new String();
                    ()->new String();
                    方法引用
                    String::new

2.局部内部类中变量的修饰符
    final修饰符可省略
    内部类在访问 它所在的方法中的变量时 该变量必须是常量(被final修饰的)
    jdk1.8之后 省略了final修饰符 但是本质上该变量还是final的
3.接口支持静态方法 与 默认方法
    static
    default
    接口中的方法 可以用 abstract / default / static 修饰
    修饰符不能混合使用

    被abstract修饰的方法 子类必须重写
    被default/static修饰的方法 子类可以选择性重写
        重写default修饰的方法时 权限修饰符必须是public
4.Time包下的类
    jdk1.8新增了一些处理时间问题的专门类
    Time包下
        LocalDate 代表的是 不带时间的日期 yyyyMMdd
        LocalTime 代表的是 不带日期的时间 HH:mm:ss
        LocalDateTime 包含了日期与时间 不过没有带时区 
        ZonedDateTime 包含了 日期与时间 带时区
        ...
5.Stream接口
    和Iterator很像
    Stream (流) 和 InputStream/OutputStream 没有关系

    Stream 表示能应用在一组元素上一次执行的操作序列
    Stream 提供了很多Lambda表达式方法

    操作分为 中间操作 和 最终操作两种

    中间操作 返回 ---> Stream 本身
        filter / stream / distinct / sorted
    最终操作 返回 ---> 一个特定类型的计算结果
        count / iterator / limit / match / max / min / findFirst / collect
    创建一个Stream 需要指定一个数据源 比如Collection的子类
        List 和 Set
    Map不支持

猜你喜欢

转载自blog.csdn.net/weixin_42738506/article/details/81511094