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類的替代者)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM