美文网首页
Java8新特性

Java8新特性

作者: leoryzhu | 来源:发表于2019-03-18 16:37 被阅读0次

    1、语言新特性

    1.1、Lambda表达式(也称闭包)

    Lambda表达式是Java8最大的卖点,它允许交函数作为参数传递给某个方法,或者把代码本身当成数据处理,在java8之前的版本中,只能用匿名内部类代替Lambda表达式。用->分隔函数形参和函数体,

    Arrays.asList( "a", "b", "d" ).forEach( e -> System.out.println( e ) );

    如果函数体有多条语句,函数体花括号括起来

    Arrays.asList( "a", "b", "d" ).forEach( e -> {
    System.out.print( e );
    System.out.print( e );
    } );

    Lambda表达示有返回值,其类型和形参类型一样也是由编译器推测出来,如果函数体只有一条语句,则可以不用return,如

    Arrays.asList( "a", "b", "d" ).sort( ( e1, e2 ) -> e1.compareTo( e2 ) );

    1.2、接口的默认方法和静态方法

    默认方法使得开发者可以在 不破坏二进制兼容性的前提下,往现存接口中添加新的方法,即不强制那些实现了该接口的类也同时实现这个新加的方法。默认方法和抽象方法之间的区别在于抽象方法需要实现,而默认方法不需要。接口提供的默认方法会被接口的实现类继承或者覆写,例子代码如下:

    private interface Defaulable {
        // Interfaces now allow default methods, the implementer may or 
        // may not implement (override) them.
        default String notRequired() { 
            return "Default implementation"; 
        }        
    }
    
    private static class DefaultableImpl implements Defaulable {
    }
    

    也可以添加实现

    private static class OverridableImpl implements Defaulable {
        @Override
        public String notRequired() {
            return "Overridden implementation";
        }
    }
    

    Java 8带来的另一个有趣的特性是在接口中可以定义静态方法,例子代码如下:

    private interface DefaulableFactory {
        // Interfaces now allow static methods
        static Defaulable create( Supplier< Defaulable > supplier ) {
            return supplier.get();
        }
    }
    

    下面的代码片段整合了默认方法和静态方法的使用场景:

    public static void main( String[] args ) {
        Defaulable defaulable = DefaulableFactory.create( DefaultableImpl::new );
        System.out.println( defaulable.notRequired() );
    
        defaulable = DefaulableFactory.create( OverridableImpl::new );
        System.out.println( defaulable.notRequired() );
    }
    

    1.3、方法引用

    第一种方法引用的类型是构造器引用,语法是Class::new,或者更一般的形式:Class<T>::new。注意:这个构造器没有参数。

    final Car car = Car.create( Car::new );
    final List< Car > cars = Arrays.asList( car );
    

    第二种方法引用的类型是静态方法引用,语法是Class::static_method。注意:这个方法接受一个Car类型的参数。

    cars.forEach( Car::collide );
    

    第三种方法引用的类型是某个类的成员方法的引用,语法是Class::method,注意,这个方法没有定义入参:

    cars.forEach( Car::repair );
    

    第四种方法引用的类型是某个实例对象的成员方法的引用,语法是instance::method。注意:这个方法接受一个Car类型的参数:

    final Car police = Car.create( Car::new );
    cars.forEach( police::follow );
    

    1.4 重复注解

    自从Java 5中引入注解以来,这个特性开始变得非常流行,并在各个框架和项目中被广泛使用。不过,注解有一个很大的限制是:在同一个地方不能多次使用同一个注解。Java 8打破了这个限制,引入了重复注解的概念,允许在同一个地方多次使用同一个注解。

    在Java 8中使用@Repeatable注解定义重复注解,实际上,这并不是语言层面的改进,而是编译器做的一个trick,底层的技术仍然相同

    相关文章

      网友评论

          本文标题:Java8新特性

          本文链接:https://www.haomeiwen.com/subject/xhyshftx.html