java1.8的几大新特性

来源:互联网 发布:windows android 编辑:程序博客网 时间:2024/06/05 00:21

百战程序员8月10日遇到的问题
java的新特性

1、接口方面:

接口中增加了默认实现方法和静态方法。代码举例:

public interface Demo {    default String get(String a,String b){        System.out.println("我是jdk1.8默认的实现方法...");        return "";    }    static void staticmethod(){        System.out.println("我是静态方法...");    }}class demo1 implements Demo{    @Override    public String get(String a, String b) {        // TODO Auto-generated method stub        return Demo.super.get(a, b);    }}

以前的版本定义接口是不能有实现机制的,现在这样用了一个default关键字后,就可以实现,然后子类还可以重写,也可以直接使用。感觉有点像抽象类了,越来越灵活。加入静态方法后,你以后的
工具类就可以参考接口来设计啦。也算是一个优点吧。

2、Lambda表达式简化了代码

public interface Demo {    public static void main(String[] args) {        List<String> names=Arrays.asList("peter","anna","mike","xenia");        //匿名内部类        Collections.sort(names,new Comparator<String>(){            @Override            public int compare(String o1, String o2) {                  return o1.compareTo(o2);            }        });        for (String string : names) {            System.out.print(string+" ");        }                   }}

只需要给静态方法Collections.sort传入一个List对象以及一个比较器来按指定顺序排序。通常做法都是创建一个匿名的比较器对象然后将其传递给sort方法。
注意:java1.8中你就没必要使用传统的匿名对象的方式了,提供了更为简单的语法,就是Lambda表达式。

第一种方式

public interface Demo {    public static void main(String[] args) {        List<String> names=Arrays.asList("peter","anna","mike","xenia");            Collections.sort(names,(String a,String b)->{            return a.compareTo(b);        });        for (String string : names) {            System.out.print(string+" ");        }    }}

第二种方式

public interface Demo {    public static void main(String[] args) {        List<String> names=Arrays.asList("peter","anna","mike","xenia");            Collections.sort(names,(a,b)->a.compareTo(b));        for (String string : names) {            System.out.print(string+" ");        }    }}

java编译器可以自动推导出参数类型,所以你可以不用写一次类型,Lambda简化了代码。

3、函数试接口与静态导入

Lambda表达式是如何在java的类型系统中表示的呢?每一个lambda表达式都对应一个类型,通常是接口类型。而“函数式接口”是指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法。
因为默认方法不算抽象方法,所以你也可以给你的函数式接口添加默认方法。
我们可以将lambda表达式当作任意只包含一个抽象方法的接口类型,确保你的接口一定达到这个要求,你只需要给你的接口添加 @FunctionalInterface 注解,编译器如果发现你标注了这个注解的接口有多于一个抽象方法的时候会报错的。

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

5、访问局部变量

6、访问对象字段与静态变量

原创粉丝点击