zoukankan      html  css  js  c++  java
  • JDK8新特性面试

    java8:http://ifeve.com/java-8-features-tutorial/

    一、Lambda表达式和函数式接口

    Lambda表达式(也叫做闭包

    它允许我们将一个函数当作方法的参数(传递函数),或者说把代码当作数据

    Lambda表达式可以用逗号分隔的参数列表、->符号和功能语句块来表示

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

    编译器会根据上下文来推测参数的类型,或者你也可以显示地指定参数类型,只需要将类型包在括号里

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

    如果Lambda的功能语句块太复杂,可以用大括号包起来

    1 String separator = ",";
    2 Arrays.asList( "a", "b", "d" ).forEach(
    3     ( String e ) -> System.out.print( e + separator ) );

    Lambda表达式可能会引用类的成员或者局部变量(会被隐式地转变成final类型)

    1 String separator = ",";
    2 Arrays.asList( "a", "b", "d" ).forEach(
    3     ( String e ) -> System.out.print( e + separator ) );
    4 等价于
    5 final String separator = ",";
    6 Arrays.asList( "a", "b", "d" ).forEach(
    7     ( String e ) -> System.out.print( e + separator ) );

    Lambda表达式可能会有返回值,编译器会根据上下文推断返回值的类型

    如果lambda的语句块只有一行,不需要return关键字

    1 Arrays.asList( "a", "b", "d" ).sort( ( e1, e2 ) -> e1.compareTo( e2 ) );
    2 等价于
    3 Arrays.asList( "a", "b", "d" ).sort( ( e1, e2 ) -> {
    4     int result = e1.compareTo( e2 );
    5     return result;
    6 } );

    函数接口是一种只有一个方法的接口,像这样地,函数接口可以隐式地转换成lambda表达式。

    Java 8提供了一个特殊的注解@FunctionalInterface来克服脆弱性并且显示地表明函数接口的目的

    注意: 默认的方法和静态方法(下一节会具体解释)不会违反函数接口的约定

    1 @FunctionalInterface
    2 public interface FunctionalDefaultMethods {
    3     void method();
    4 
    5     default void defaultMethod() {
    6     }
    7 }

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

    Java 8增加了两个新的概念在接口声明的时候:默认和静态方法。

    默认方法和Trait有些类似,但是目标不一样。

    默认方法允许我们在接口里添加新的方法,而不会破坏实现这个接口的已有类的兼容性,也就是说不会强迫实现接口的类实现默认方法

    默认方法抽象方法的区别是抽象方法必须要被实现,默认方法不是。作为替代方式,接口可以提供一个默认的方法实现,所有这个接口的

    实现类都会通过继承得倒这个方法(如果有需要也可以重写这个方法)

    Java 8 的另外一个新特性是接口里可以声明静态方法,并且可以实现

    1 private interface DefaulableFactory {
    2     // Interfaces now allow static methods
    3     static Defaulable create( Supplier< Defaulable > supplier ) {
    4         return supplier.get();
    5     }
    6 }

    接口的静态方法和默认方法放在一起的示例,::new 是构造方法引用

    1 public static void main( String[] args ) {
    2     Defaulable defaulable = DefaulableFactory.create( DefaultableImpl::new );
    3     System.out.println( defaulable.notRequired() );
    4  
    5     defaulable = DefaulableFactory.create( OverridableImpl::new );
    6     System.out.println( defaulable.notRequired() );
    7 }

    java 8支持的4种方法引用

     1 public static class Car {
     2     public static Car create( final Supplier< Car > supplier ) {
     3         return supplier.get();
     4     }             
     5  
     6     public static void collide( final Car car ) {
     7         System.out.println( "Collided " + car.toString() );
     8     }
     9  
    10     public void follow( final Car another ) {
    11         System.out.println( "Following the " + another.toString() );
    12     }
    13  
    14     public void repair() {
    15         System.out.println( "Repaired " + this.toString() );
    16     }
    17 }

    第一种方法引用是构造方法引用,语法是: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 );

    4   重复注释

    Java 8引入了重复注释,允许相同注释在声明使用的时候重复使用超过一次

    Optional

    1 Optional< String > fullName = Optional.ofNullable( null );
    2 System.out.println( "Full Name is set? " + fullName.isPresent() );       
    3 System.out.println( "Full Name: " + fullName.orElseGet( () -> "[none]" ) );
    4 System.out.println( fullName.map( s -> "Hey " + s + "!" ).orElse( "Hey Stranger!" ) );

    如果Optional实例有非空的值,

    方法 isPresent() 返回true否则返回false。

    方法orElseGet提供了回退机制,当Optional的值为空时接受一个方法返回默认值。

    map()方法转化Optional当前的值并且返回一个新的Optional实例。

    orElse方法和orElseGet类似,但是它不接受一个方法,而是接受一个默认值

    Stream

    Stream是多个元素的序列,支持串行和并行操作。

    Stream操作被分为中间操作和终点操作

    中间操作返回一个新的Stream。这些中间操作是延迟的,执行一个中间操作比如filter实际上不会真的做过滤操作,而是创建一个新的

    Stream,当这个新的Stream被遍历的时候,它里头会包含有原来Stream里符合过滤条件的元素。

    终点操作比如说forEach或者sum会遍历Stream从而产生最终结果或附带结果。终点操作执行完之后,Stream管道就被消费完了,不再

    可用。在几乎所有的情况下,终点操作都是即时完成对数据的遍历操作。

    日期时间

    Clock

    LocalDate  只保存有ISO-8601日期系统的日期部分,有时区信息

    LocalTime  只保存ISO-8601日期系统的时间部分,没有时区信息

    LocalDateTime类合并了LocalDate和LocalTime,它保存有ISO-8601日期系统的日期和时间,但是没有时区信息

    ZonedDateTime,它保存有ISO-8601日期系统的日期和时间,而且有时区信息

    Duration类,Duration持有的时间精确到纳秒。它让我们很容易计算两个日期中间的差异

    Nashorn javascript引擎

    Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用

    Base64

    新的Base64API也支持URL和MINE的编码解码

    并行数组

    Java 8新增加了很多方法支持并行的数组处理parallelSort()

    并发

    java.util.concurrent.ConcurrentHashMap中加入了一些新方法来支持聚集操作

    java.util.concurrent.ForkJoinPool类中加入了一些新方法来支持共有资源池

    java.util.concurrent.locks.StampedLock类提供一直基于容量的锁,这种锁有三个模型来控制读写操作(它被认为是不太有名的

    java.util.concurrent.locks.ReadWriteLock类的替代者)

  • 相关阅读:
    mysql数据库开放远程连接的方法
    MySQL数据库字符集由utf8修改为utf8mb4一例
    解决silk-v3-decoder-master转换wav时,百度语音解析问题
    PHP高效率写法(详解原因)
    如何计算服务器能够承受多大的pv?
    微信开发中使用curl忽略https证书
    PHP libevent函数基本介绍
    PHP stream相关协议及上下文选项和参数归纳
    Centos搭建PHP5.3.8+Nginx1.0.9+Mysql5.5.17
    编码转换(UTF8->GBK)
  • 原文地址:https://www.cnblogs.com/wangwanchao/p/5269648.html
Copyright © 2011-2022 走看看