1. 程式人生 > >關於jdk7和jdk8 一些新特性的總結

關於jdk7和jdk8 一些新特性的總結

java7新特性

1. 自動資源管理
            只要資源實現AutoCloseable介面JVM可以幫我們自動關閉資源   
            jdk7的流實現了都該介面。
                    try(裡面寫要開啟的資源){
                    }              
2. 鑽石表示式
               List<String> list = new ArrayList<>();
               jdk 1.7開始後 我們只需要在宣告集合的時候指定泛型型別,在建立集合物件的時候
               需要宣告泛型型別,(JVM使用自動型別推斷。)

3. 數字字面量下劃線支援
                    1_000.232_3
                    輸出該數的時候會自動忽略下劃線
                    下劃線的使用規則:不能出現在數字的開頭或結尾,不能小數點,F,L,
                      ,0X,0B 的左右
4. switch探測String
                 jdk1.7以前
5. 二進位制字面量
                 可以使用二進位制格式,用0B/0b作為標記
                  byte型別時一個位元組 8位  
                  最高位為符號位,0代表正數,1表示負數
                  0b1000_0000 最小的負數 -128
                 java中表示負數時,採用特殊的補碼+反碼格式。

java8新特性

1)Lambda表示式
              Lambda 是一個匿名函式,我們可以把 Lambda 
              表示式理解為是一段可以傳遞的程式碼(將程式碼像資料一樣進行傳遞)。
              Lambda 表示式的基礎語法:Java8中引入了一個新的操作符 "->" 該操作符稱為箭頭操作符或 Lambda 操作符
 例如 :  (x) -> System.out.println(x)
              箭頭操作符將 Lambda 表示式拆分成兩部分:
              左側:Lambda 表示式的引數列表
              右側:Lambda 表示式中所需執行的功能, 即 Lambda 體
              
                
2)函式式介面      
               只包含一個抽象方法的介面,稱為函式式介面函式式介面。
               你可以通過 Lambda 表示式來建立該介面的物件。
               我們可以在任意函式式介面上使用 @ @FunctionalInterface註解,
               這樣做可以檢查它是否是一個函式式介面,同時 javadoc 也會包
               含一條宣告,說明這個介面是一個函式式介面。
                * Java8 內建的四大核心函式式介面

                 * Consumer<T> : 消費型介面
	                void accept(T t);

                * Supplier<T> : 供給型介面
	              T get(); 

                * Function<T, R> : 函式型介面
			 	  R apply(T t);

                * Predicate<T> : 斷言型介面
				  boolean test(T t);


3)介面可以使用預設方法和靜態方法 
                 public interface MyFun {
			               default String getName(){
				                    return "哈哈哈";
			                 }
                            static  void print(){                                     
                                 System.out.println("static method");
                             }
                      }
         
4)方法引用與構造器引用  
              要傳遞給Lambda體的操作,已經有實現的方法了,可以使用方法引用!
            ( 實現抽象方法的引數列表,必須與方法引用方法的引數列表保持一致!) 
              一、方法引用的格式            
                1. 物件的引用 :: 例項方法名
                2.  類::靜態方法
                3. 類名 :: 例項方法名
                    注意:當需要引用方法的第一個引數是呼叫物件,並且第二個引數是需要引用方法的第一個引數是呼叫物件,並且第二個引數是需要引
                         用方法的第二個引數(或無引數 )時:ClassName::methodName
                         如:BiPredicate<String, String> bp2 = String::equals;
                  二、構造器引用 :構造器的引數列表,需要與函式式介面中引數列表保持一致!
                          格式 :1. 類名 :: new
                  三、陣列引用
                  	型別[] :: new
5)Stream的API
      1. 建立 Stream
                  1). Collection 提供了兩個方法  stream() 與 parallelStream()
                  2). 通過 Arrays 中的 stream() 獲取一個數組流
                  3). 通過 Stream 類中靜態方法 of()
                  4). 建立無限流
      2. 中間操作
	                       **篩選與切片**
	filter——接收 Lambda , 從流中排除某些元素。
	limit——截斷流,使其元素不超過給定數量。
	skip(n) —— 跳過元素,返回一個扔掉了前 n 個元素的流。若流中元素不足 n 個,則返回一個空流。與 limit(n) 互補
	distinct——篩選,通過流所生成元素的 hashCode() 和 equals() 去除重複元素
                          **對映**
	map——接收 Lambda , 將元素轉換成其他形式或提取資訊。接收一個函式作為引數,該函式會被應用到每個元素上,並將其對映成一個新的元素。
	flatMap——接收一個函式作為引數,將流中的每個值都換成另一個流,然後把所有流連線成一個流
                          **排序**  
          sorted()——自然排序
	 sorted(Comparator com)——定製排序
               
      3. 終止操作(終端操作)   注意:流進行了終止操作後,不能再次使用

	        allMatch——檢查是否匹配所有元素
			anyMatch——檢查是否至少匹配一個元素
			noneMatch——檢查是否沒有匹配的元素
			findFirst——返回第一個元素
			findAny——返回當前流中的任意元素
			count——返回流中元素的總個數
			max——返回流中最大值
			min——返回流中最小值
                   **歸約**
	reduce(T identity, BinaryOperator) / reduce(BinaryOperator) ——可以將流中元素反覆結合起來,得到一個值。