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 action)
            Map 1.8新增方法
                default void forEach(BiConsumer 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不支持

你可能感兴趣的:(Java学习)