一、新特性 jdk1.8的一些新特性主要還是簡化了代碼的寫法,減少了部分開發量. jdk1.8相較于1.7以前有5方面的優化, 1、速度更快 2、代碼更少(增加了新的語法Lambda運算式) 3、強大Stream API 4、便于并行 5、最大化減少空指標例外 OPtional 1、default關鍵字 在java里面,我們通常都是認為介面里面是只能有抽象方法,不能有任何方法的實作的,那么在 jdk1.8里面打破了這個規定,引入了新的關鍵字default,通過使用default修飾方法,可以讓我們在介面里面定義具體的方法實作 1.1: 那這么定義一個方法的作用是什么呢?為什么不在介面的實作類里面再去實作方法呢? 答: 其實這么定義一個方法的主要意義是定義一個默認方法,也就是說這個介面的實作類實作了這個 介面之后,不用管這個default修飾的方法,也可以直接呼叫所以說這個default方法是所有的實作類都不需要去實作的就可以直接呼叫,那么比如說jdk的集合List里面增加了一個sort方法,那么如果定義為一個抽象方法,其所有的實作類如arrayList,LinkedList等都需要對其添加實作,那么現在用default定義一個默認的方法之后,其實作類可以直接使用這個方法了,這樣不管是開發還是維護專案,都會大大簡化代碼量, 2、Lambda 運算式 Lambda運算式是jdk1.8里面的一個重要的更新,這意味著java也開始承認了函式式編程,并且嘗試引入其中, 2.1: 首先,什么是函式式編程,參考廖雪峰先生的教程里面的解釋就是說:函式式編程就是一種抽象程度很高的編程范式,純粹的函式式編程語言撰寫的函式沒有變數,因此,任意一個函式,只要輸入是確定的,輸出就是確定的,這種純函式我們稱之為沒有副作用,而允許使用變數的程式設計語言,由于函式內部的變數狀態不確定,同樣的輸入,可能得到不同的輸出,因此,這種函式是有副作用的,函式式編程的一個特點就是,允許把函式本身作為引數傳入另一個函式,還允許回傳一個函式! 簡單的來說就是,函式也是一等公民了,在java里面一等公民有變數,物件,那么函式式編程語言里面函式也可以跟變數,物件一樣使用了,也就是說函式既可以作為引數,也可以作為回傳值, 可以看到不帶引數的寫法一句話就搞定了排序的問題,所以引入lambda運算式的一個最直觀的作用就是大大的簡化了代碼的開發,像其他一些編程語言Scala,Python等都是支持函式式的寫法的,當然,不是所有的介面都可以通過這種方法來呼叫,只有函式式介面才行,jdk1.8里面定義了好多個函式式介面,我們也可以自己定義一個來呼叫,下面說一下什么是函式式介面, 3、函式式介面 定義:“函式式介面”是指僅僅只包含一個抽象方法的介面,每一個該型別的lambda運算式都會被匹配到這個抽象方法,jdk1.8提供了一個@FunctionalInterface注解來定義函式式介面,如果我們定義的介面不符合函式式的規范便會報錯, 4.方法與建構式參考 jdk1.8提供了另外一種呼叫方式::,當 你 需 要使用 方 法 參考時 , 目 標參考 放 在 分隔符::前 ,方法 的 名 稱放在 后 面 ,即ClassName :: methodName ,例如 ,Apple::getWeight就是參考了Apple類中定義的方法getWeight,請記住,不需要括號,因為你沒有實際呼叫這個方法,方法參考就是Lambda運算式(Apple a) -> a.getWeight()的快捷寫法 這里的User::new就是呼叫了User的構造方法,Java編譯器會自動根據UserFactory.get方法的簽名來選擇合適的建構式, 5、區域變數限制 Lambda運算式也允許使用自由變數(不是引數,而是在外層作用域中定義的變數),就像匿名類一樣, 它們被稱作捕獲Lambda, Lambda可以沒有限制地捕獲(也就是在其主體中參考)實體變數和靜態變數,但區域變數必須顯式宣告為final,或事實上是final, 為什么區域變數有這些限制? (1)實體變數和區域變數背后的實作有一個關鍵不同,實體變數都存盤在堆中,而區域變數則保存在堆疊上,如果Lambda可以直接訪問區域變數,而且Lambda是在一個執行緒中使用的,則使用Lambda的執行緒,可能會在分配該變數的執行緒將這個變數識訓之后,去訪問該變數,因此, Java在訪問自由區域變數時,實際上是在訪問它的副本,而不是訪問原始變數,如果區域變數僅僅賦值一次那就沒有什么區別了——因此就有了這個限制, (2)這一限制不鼓勵你使用改變外部變數的典型命令式編程模式, 6、Date Api更新 1.8之前JDK自帶的日期處理類非常不方便,我們處理的時候經常是使用的第三方工具包,比如commons-lang包等,不過1.8出現之后這個改觀了很多,比如日期時間的創建、比較、調整、格式化、時間間隔等,這些類都在java.time包下,比原來實用了很多, 6.1 LocalDate/LocalTime/LocalDateTime LocalDate為日期處理類、LocalTime為時間處理類、LocalDateTime為日期時間處理類,方法都類似,具體可以看API檔案或原始碼,選取幾個代表性的方法做下介紹, now相關的方法可以獲取當前日期或時間,of方法可以創建對應的日期或時間,parse方法可以決議日期或時間,get方法可以獲取日期或時間資訊,with方法可以設定日期或時間資訊,plus或minus方法可以增減日期或時間資訊; 6.2TemporalAdjusters 這個類在日期調整時非常有用,比如得到當月的第一天、最后一天,當年的第一天、最后一天,下一周或前一周的某天等, 6.3DateTimeFormatter 以前日期格式化一般用SimpleDateFormat類,但是不怎么好用,現在1.8引入了DateTimeFormatter類,默認定義了很多常量格式(ISO打頭的),在使用的時候一般配合LocalDate/LocalTime/LocalDateTime使用,比如想把當前日期格式化成yyyy-MM-dd hh:mm:ss的形式: 7:HashMap HashMapJDK1.7和1.8有什么變化; 主要還是HashMap中鏈長度大于8時采取紅黑樹的結構存盤,(1.7的時候是鏈表結構) 紅黑樹,除了添加,效率高于鏈表結構,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/164472.html
標籤:其他
下一篇:阿里云能都涉及哪些內容
