一個語言要想一直有活力,它也須要跟隨着時代的變化去進步,Java做爲一個古老的語言,它其實有太多的歷史包袱,在改變的過程當中須要考慮不少,可是它也在慢慢的演變,鞏固本身的城牆,不讓本身被遺忘在歷史中(很多的編程語言已經隨着時間的推移,消失在人們的視線中)。固然,做爲一個拿Java語言當成主語言的程序員,它的進步其實也在延長咱們的職業生涯。java
Java8帶來了不少新的特性,雖然Java8發佈已經好久了,可是一直沒有系統的學習,因此這部分一直沒有進行總結。前東家考慮到與以前系統的兼容,技術標準將JDK7做爲開發工具,這樣也沒法利用Java8帶來的新特性。其實Java做爲一個普遍應用的語言來講,它本身的發佈週期已經考慮了向前兼容,因此即便升級了JDK版本,其實也不會帶來太大的困擾,追隨最新的技術,讓員工可以學習到新的技術標準,其實也是讓員工更加穩定的一種策略,同時在解決問題的同時,既獲得了鍛鍊,同時也得到了成就感。這點也很重要。程序員
因此當你想要express
已經不須要去實現一個匿名類了,匿名類太多的無用代碼,直接傳遞Lambda函數更加簡潔,易讀。
Lambda聲明方式(arg1, arg2,...) -> {statement}
,其中單句的return expression;
能夠簡寫爲(arg1, arg2,...) -> expression
。編程
Stream的強大在於它可讓你以聲明性的方式處理數據集,同時,若是數據處理過程當中數據處理過程,處理器以及收集器(這些後面會介紹)沒有反作用(函數式編程思想裏的一個概念),Stream能夠很簡單,方便的利用多核架構的優點,自動的並行執行。因此它的兩個強大優勢:聲明式數據處理,自動的並行執行。讓咱們看看這兩個Stream的優點,當你熟練使用,必定會對它愛不釋手的。
api
若是你瞭解RxJava背後的思想,其實這個和RxJava使用很是類似,固然RxJava功能比Stream要強大一些,可是思考的時候也是利用這種圖形來思考數據處理,RxJava是簡化異步編程的一種模型,若是不瞭解能夠去學習一下,很方便的一個工具。這裏多扯一句,如今高併發的環境下,對異步的需求愈來愈多,這樣在IO密集的場景下節省資源,能夠支持高併發,可是異步編程一個缺點就是不符合人們的思考習慣,因此寫起來很複雜。RxJava的思想必定程序上減小了這種不方便。
可是新進的語言Go就從另一種角度解決了這個問題,它在runtime支持協程的概念,你能夠理解協程就是能夠共享一個線程的幾個程序塊,由程序員去管理協程之間的切換。這個好處是充分利用了線程,而且能夠容忍用戶以同步的模型去編寫代碼,解決了異步編程中不符合人們思考的習慣。固然這只是我粗鄙的理解,Go語言是值得學習的語言,能夠拿來做爲一個備選語言學習。架構
Steam上的操做能夠分爲兩大類操做併發
中間操做
異步
終端操做
編程語言
Stream上有一個很是好用的終端操做,它就是收集器。Java中提供了一些預約義的收集器,這些收集器均經過Collector
類提供的工廠方法建立,按照功能分類以下。函數式編程
Stream的並行數據處理這部分暫時不提,其中涉及到並行流底層的實現,並且還有如何自定義的分割流,須要明白其原理才能正確的使用。這裏暫時先記住Stream能夠透明的並行數據處理,提升程序效率。
Java歷史已經好久了,可是目前爲了讓集合支持Stream接口,咱們須要針對集合提供一個stream的方法,可是已有不少的第三方庫實現了Collection接口,若是貿然在接口中添加方法,則會破壞向前兼容的屬性。因此Java8提供了默認方法,可以保持向前兼容。
可是默認方法的引入在某些狀況下會引入一些衝突,相似C++多繼承中的菱形繼承問題,這裏Java8有一個解決衝突的規則,
Optional就是防止NullPointerException的出現而存在的一個特性,其實它在語義方面給予咱們更多更多的代碼可讀性,設想當一個類的屬性使用Optional進行包裝,使用這個屬性的人就能夠了解到這個屬性可能爲null值,使用的時候就會當心謹慎,可是當一個屬性沒有使用Optional包裝,也就是說我能夠放心的使用該引用,而不須要擔憂NullPointerException。可是這須要一個team的約定。
Optional也能夠在某些須要斷定引用是否爲null的地方去除if else判斷來使得代碼更加簡潔。
這個接口使得靈活的完成組合式的異步編程,是針對Future接口進一步的功能加強,可是相對於RxJava這種異步編程庫,其語義仍是差一些,不過仍是能夠了解一下的。
Java8解決的另一個重要問題是解決以前老版本Java中java.util.Date
類以及其餘用於建模日期時間類設計上的缺陷(易變性、糟糕的偏移值、默認值和命令)
關於Java中日期時間的操做,之後儘可能使用java.time
包下的幾個新的類,包含LocalDate
, LocalTime
, Instant
, Duration
和Period
。
Java不斷的革新本身使得本身適應如今的編程場景,做爲一名技術人員固然也須要不斷的更新本身的知識,保證本身也不斷的跟隨着浪潮前進。