JDK 1.8 新特性 ( 二) ---- 特性汇总

来源:互联网 发布:国内云计算厂商 编辑:程序博客网 时间:2024/06/14 21:00

Java8 新特性:
1、 介绍:
Java8是Java自Java5之后最重要的版本,这个版本包含语言、编译器、库、工具和Jvm等方面的十多个特性
2、 接口的默认方法与静态方法: 扩展接口的声明
a: 默认方法: 允许在已有的接口中添加新方法,而同时又保持了与旧版本代码的兼容性。默认方法与抽象方法不同之处在于抽象方法必须要求实现,但是默认方法则没有这个要求。相反,每个接口都必须提供一个所谓的默认实现,这样所有的接口实现者都默认继承它(如果有必要的话,可以覆盖这个默认实现)
b: 静态方法: 允许添加静态方法,接口的静态方法属于接口类本身,不被继承,也需要提供方法的实现
c: 默认方法和接口方法的方法
静态方法: 接口的类名.方法名
默认方法: 实现类的引用.方法名。默认方法可以被实现类覆盖

public interface IFunctional {    void method(String from);    default void defaultMethod() {        System.out.println("接口默认方法,默认实现...");    }    static void staticMethod () {        System.out.println("接口静态方法,默认实现...");    }}class Main implements IFunctional {    public void method(String from) {        System.out.println("Main -> method");    }    // 默认方法可以被覆盖    default void defaultMethod() {System.out.println("子类覆盖了接口的默认方法...");}    public static void main (String[] args) {        // 访问接口的默认方法        Main main = new Main();        main.defaultMethod();        // 访问接口的静态方法        IFunctional.staticMethod();    }}

3、 Lambda作用域
a: 在lambda表达式中访问外层作用域和java之前的匿名类中的方式很相似,可以直接访问标记了final的外层局部变量,或者实例的字段以及静态变量
b: 访问局部变量
c: 访问成员变量与静态变量: 与匿名类一致

class Main  {    public static void main (String[] args) {        // final String tag = "abc";        String tag = "dsssss";        // 当lambda表达式调用tag后, tag变量实际上已经隐式的变成final类型的        IFunctional<String, Boolean> fun = s -> s.equals(tag);    }}

4、 函数式接口:
a:定义: 只有一个抽象函数的接口,这样的接口可以隐式转换为lambda表达式
例如: runnable comparable comparator

@FunctionalInterface  // 如果接口中的函数个数超过1个,则编译器会提示错误。默认方法和静态方法除外public interface IFunctional<T, R> {    R handler(T t);    default void method1(){}    static void method2() {}}

5、引用方法
a: lambda表达式允许使用关键字来传递方法或者构造函数的引用,但要满足某些条件
1. 类(静态)方法的引用
2. 对象方法的引用
3. 构造方法的引用

// 类方法引用public class Main {    public static void main(String[] args) {        //IFunctional<String, Integer> fun = new IFunctional<String, Integer>() {        //  @Override        //  public Integer handler(String s) {        //      return Integer.parseInt(s);        //  }        //}        //IFunctional<String, Integer> fun = s -> {        //  return Integer.parseInt(s);        //}        //IFunctional<String, Integer> fun = s -> Integer.parseInt(s);        IFunctional<String, Integer> fun = Integer::parseInt;        System.out.println(fun.handler("123"));    }}// 对象方法的引用public class Main {    static String name = new String("aaaa");    public static void main(String[] args) {        IFunctional<String, Integer> fun = name::indexOf;        fun.handler("c");    }}// 构造方法的引用public class Main {    public static void main(String[] args) {        // PersonFactory factory = (firstName, lastName) -> new Person(firstName, lastName);        PersonFactory factory = Person::new;    }    static class Person {        String firstName;        String lastName;        public Person (String firstName, String lastName) {            this.firstName = firstName;            this.lastName = lastName;        }        interface PersonFactory {            Person create(String firstName, String lastName);        }    }}