java 8新特性(一)

Java 8出来有很长一段时间了,因为以前一直在搞Ruby都没时间好好学习下,趁着有空整理一下html

http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.htmljava

这里咱们主要看编程语言相关的新特性:编程

Lambda表达式:

        如今的匿名类有一个问题就是,当一个匿名类的实现很是简单,如一个接口只包含了惟一一个抽象方法,它的匿名类实如今解析的时候是笨重的且不清晰的。在这种状况下,咱们一般会尝试将功能的实现当作另外一个方法的参数传入,好比swing中当点击一个按钮,须要作的处理动做。Lambda表达式容许你这么作,将功能做为方法参数或者将代码做为数据。这个特性是属于函数式编程的特性,将一个代码块做为参数传入,若是学习过ruby的哈应该很好理解,与ruby的lambda表达式很相似。下面看一下官方给出的例子(因为例子太长,只展现重要部分,有兴趣能够本身去上面的地址看):ruby

没有用Lambda表达式以前:oracle

printPersons(
    roster,
    new CheckPerson() {
        public boolean test(Person p) {
            return p.getGender() == Person.Sex.MALE
                && p.getAge() >= 18
                && p.getAge() <= 25;
        }
    }
);

用了以后:编程语言

printPersons(
    roster,
    (Person p) -> p.getGender() == Person.Sex.MALE
        && p.getAge() >= 18
        && p.getAge() <= 25);

能够看出用了Lambda以后字须要给出方法实现的代码便可,简洁了很多,代码嵌套也少了两层,若是实现代码有多行时,须要在 ->后面使用{}同时最后必须有return,同时参数的类型也能够省略,Java编译器能够根据方法定义自动推导出参数类型。ide

接口的默认方法:

    Java 8 容许在接口中定义非抽象的方法,须要用关键字default,叫作接口的默认方法或者扩展方法,这种方法能够定义多个。函数式编程

具体代码以下:函数

public interface Parser {
    String getResult(String info);
    default String notKnow() {
        return "Sorry I do't know!";
    }
    default String anotherOne() {
        return "another one";
    }
}

public class AgeParser implements Parser {
  
    @Override
    public String getResult(String info) {
        if (info.matches("How old are you")) {
            return "I'm 23";
        } else {
            return notKnow();
        }
    }

    public static void main(String[] args) {
        AgeParser parser = new AgeParser();
        System.out.println(parser.getResult("How old are you"));
        System.out.println(parser.getResult("You do't know"));
        System.out.println(parser.anotherOne());
    }
}

默认方法在接口的实现类中能够直接使用不须要重写,固然也是能够在实现类中重写这个方法的,同时,若是其余的接口继承了这个接口,那么默认方法也会被继承,同时能够在接口中重写默认方法。学习

函数式接口:

        在上面Lambda表达式中,曾提出过一个接口只包含了惟一一个抽象方法(能够同时包含多个默认方法),这个接口被叫作函数式接口,也只有函数式接口才能使用Lambda表达式建立其对应的匿名内部类的实例,同时为了确保接口必定知足函数式接口的要求,能够在接口申明的上面加上@FunctionalInterface注解,若是不知足要求,如抽象方法多余一个,就会编译不过。

相关文章
相关标签/搜索