JAVA8 十大新特性详解

来源:互联网 发布:58中国网络经纪人app 编辑:程序博客网 时间:2024/05/16 09:18

教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API上的改进,比如流,函数式接口,Map以及全新的日期API

方法/步骤

  1. 一、接口的默认方法

    Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下:

    interface Formula {    double calculate(int a);

        default double sqrt(int a) {        return Math.sqrt(a);    }}

    Formula接口在拥有calculate方法之外同时还定义了sqrt方法,实现了Formula接口的子类只需要实现一个calculate方法,默认方法sqrt将在子类上可以直接使用。

    Formula formula = new Formula() {    @Override    public double calculate(int a) {        return sqrt(a * 100);    }};

    formula.calculate(100);     // 100.0formula.sqrt(16);           // 4.0

  2. 二、Lambda 表达式

    首先看看在老版本的Java中是如何排列字符串的:

    List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");

    Collections.sort(names, new Comparator<String>() {    @Override    public int compare(String a, String b) {        return b.compareTo(a);    }});

    只需要给静态方法 Collections.sort 传入一个List对象以及一个比较器来按指定顺序排列。通常做法都是创建一个匿名的比较器对象然后将其传递给sort方法。

    在Java 8 中你就没必要使用这种传统的匿名对象的方式了,Java 8提供了更简洁的语法,lambda表达式:

    Collections.sort(names, (String a, String b) -> {    return b.compareTo(a);});

    看到了吧,代码变得更段且更具有可读性,但是实际上还可以写得更短:

    Collections.sort(names, (String a, String b) -> b.compareTo(a));

    对于函数体只有一行代码的,你可以去掉大括号{}以及return关键字,但是你还可以写得更短点:

    Collections.sort(names, (a, b) -> b.compareTo(a));

  3. 三、函数式接口

    Lambda表达式是如何在java的类型系统中表示的呢?每一个lambda表达式都对应一个类型,通常是接口类型。而“函数式接口”是指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法。因为 默认方法 不算抽象方法,所以你也可以给你的函数式接口添加默认方法。

    我们可以将lambda表达式当作任意只包含一个抽象方法的接口类型,确保你的接口一定达到这个要求,你只需要给你的接口添加 @FunctionalInterface 注解,编译器如果发现你标注了这个注解的接口有多于一个抽象方法的时候会报错的。

    示例如下:

    @FunctionalInterfaceinterface Converter<F, T> {    T convert(F from);}Converter<String, Integer> converter = (from) -> Integer.valueOf(from);Integer converted = converter.convert("123");System.out.println(converted);    // 123

  4. 四、方法与构造函数引用

    onverter<String, Integer> converter = Integer::valueOf;Integer converted = converter.convert("123");System.out.println(converted);   // 123

    Java 8 允许你使用 :: 关键字来传递方法或者构造函数引用,上面的代码展示了如何引用一个静态方法,我们也可以引用一个对象的方法:

    converter = something::startsWith;String converted = converter.convert("Java");System.out.println(converted);    // "J"

  5. 五、Lambda 作用域

    在lambda表达式中访问外层作用域和老版本的匿名对象中的方式很相似。你可以直接访问标记了final的外层局部变量,或者实例的字段以及静态变量。

  6. 六、访问局部变量

    我们可以直接在lambda表达式中访问外层的局部变量:

    final int num = 1;Converter<Integer, String> stringConverter =        (from) -> String.valueOf(from + num);

    stringConverter.convert(2);     // 3

  7. 七、访问对象字段与静态变量

    和本地变量不同的是,lambda内部对于实例的字段以及静态变量是即可读又可写。该行为和匿名对象是一致的:

    class Lambda4 {    static int outerStaticNum;    int outerNum;

        void testScopes() {        Converter<Integer, String> stringConverter1 = (from) -> {            outerNum = 23;            return String.valueOf(from);        };

            Converter<Integer, String> stringConverter2 = (from) -> {            outerStaticNum = 72;            return String.valueOf(from);        };    }}

  8. 八、访问接口的默认方法

    还记得第一节中的formula例子么,接口Formula定义了一个默认方法sqrt可以直接被formula的实例包括匿名对象访问到,但是在lambda表达式中这个是不行的。Lambda表达式中是无法访问到默认方法的,以下代码将无法编译:

  9. 九、Date API

    Java 8 在包java.time下包含了一组全新的时间日期API。新的日期API和开源的Joda-Time库差不多,但又不完全一样,下面的例子展示了这组新API里最重要的一些部分:Clock 时钟

    Clock类提供了访问当前日期和时间的方法,Clock是时区敏感的,可以用来取代 System.currentTimeMillis() 来获取当前的微秒数。某一个特定的时间点也可以使用Instant类来表示,Instant类也可以用来创建老的java.util.Date对象。

  10. 十、Annotation 注解

    在Java 8中支持多重注解了,先看个例子来理解一下是什么意思。首先定义一个包装类Hints注解用来放置一组具体的Hint注解:

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 白色轿车有刮痕怎么办 办签证手机钱包怎么办 怎么办美国10年签证 我没有出生证明怎么办 去台湾探亲怎么办签证 漏接澳大利亚签证电话怎么办 冰岛游公证认证怎么办 莲蓬头开关坏了怎么办 淋浴莲蓬头坏了怎么办 手机ld密码忘掉怎么办 脊椎压迫神经头晕怎么办 脊椎疼导致头晕怎么办 脊椎疼引起头晕怎么办 去英国探亲签证怎么办 地税国税合并人员怎么办 机场服务员老了怎么办 在国外没有钱了怎么办 被劫持为人质怎么办 在印度签证过期怎么办 办签证被拒怎么办 澳洲留学生怎么办新加坡签证 韩国交换生签证怎么办 没有钱还贷款怎么办 英国主动退学后怎么办 英国留学被劝退怎么办 英国留学签证被拒怎么办 签证纸丢了怎么办 日本的探亲签证怎么办 成都去港澳怎么办签证 在北京怎么办泰国签证 法院判决不准离婚怎么办 再婚小孩上户口怎么办 被供应商起诉了怎么办 离婚案原告撤诉怎么办 离婚起诉不到场怎么办 判决书判了败诉怎么办 对执行裁定不服怎么办 贴吧尺寸超限怎么办 usbkey密码忘了怎么办 农信房贷逾期几个小时怎么办 广东农信房贷逾期一天怎么办