Java新特徵學習
Java新特徵學習
一. try-with-resources jdk1.7
前
後
二. JDK 8 中介面允許有預設實現,那麼這個 default 方法,是對所有實現類都有價值的預設實現。jdk 8
三. lambda表示式(lambda expressions) jdk8
對map的迴圈遍歷,
四. map的新用法
還有上文的遍歷
五 Java.util.Objects JDK 1.7
裡面封裝了一些常用操作如compare、equals/deepEquals、hash/hashCode、isNull/nonNull、requiredNonNull、toString這12個常用方法。
六 , Optional 類 jdk8 解決NPE問題 (2017年7月19日21:08:53 ) 日後
http://blog.csdn.net/hj7jay/article/details/52459334
https://github.com/winterbe/java8-tutorial#default-methods-for-interfaces
java8 新特性學習(根據上面github)
1、 介面的default方法
預設實現,其子類自動繼承其程式碼,但重寫後有各自的實現
2、Lambda表示式
總結來說 : 就是實現介面方法,直接引數->方法體(或 物件::物件的方法)其中 new字代表構造方法
其他代表 執行方法,但是當寫成 from,就解析不了多個方法引數了
如果 lambda表示式範圍內訪問成員變數,必須為final ,雖然沒有強制必須顯示宣告final
但你改了會報錯,如下
介面中的d efault方法不能使用lambda表示式
內建的lambda 表示式介面有
Predicate
Function
Suppliers
Consumers
Comparators
Runnables
Callables
不過這麼做有什麼意義呢? 不如直接呼叫方法
斷言介面(Predicates)、功能介面(Functions)、供應介面(Suppliers)、消費介面(Consumers)、比較介面(Comparators)、選項介面(Optionals)。
http://blog.csdn.net/gdouchufu/article/details/29235975
用法可能是更好支援了函數語言程式設計,但現在還理解不來其好處。如下
要改程式碼,直接改 callable的實現就可以。
相當於更加簡單了程式碼, 不用寫很多介面了
感覺還是不太好用
foreach 挺方便
3、流 .stream() 還不錯,很強大
對集合的過濾,篩選,修改元素 等等,執行操作後轉移集合元素
程式碼全需要好好看看, 掌握,很不錯 。
github上 stream程式碼
parallelStream() 並行流,時間少點
其中reduce 方法比較難以理解,網上部落格
http://blog.csdn.net/io_field/article/details/54971679
說是處理併發
既然是流,就有關閉,java雖然給了許可權關閉,但是當執行完一個流方法後會再執行流方法就會報出錯誤
stream has already been operated upon or closed
.filter 和 .sorted 兩個方法,如果 filter 後有sorted ,則會打亂filter的順序,會先不返回符合的stream。
其他情況正常, 會先匹配後返回符合的stream,進行接下來的程式碼,然後再回來接著匹配
map也同filter一樣。
flatMap 將一個流轉化為另一個流如下
分類
使用flatMap
得到所有article中的tag的流,然後呼叫collect轉化為不可重複的set
好好看看java8 的steam intStream 等相關類,流操作集合,操作迴圈,再用上lambda
Stream 11 有點看不懂 Stream12的多執行緒會打亂順序,但時不影響執行結果
4、 LocalDate LocalDateTime LocalTime
5、一個註解@Repeatable()
可以出現重複註解 ,在註解hints中有一個hint陣列註解
@Repeatable(Hints.class) 指向陣列註解 ,得到兩個註解的方式有兩種
複習註解
@FunctionalIterface 這是Java1.8 新增的註解,用於約定函式式介面。
元註解
1、@Target 表示能放在什麼位置,類、方法、屬性
ElementType.TYPE:能修飾類、介面或列舉型別
ElementType.FIELD:能修飾成員變數
ElementType.METHOD:能修飾方法
ElementType.PARAMETER:能修飾引數
ElementType.CONSTRUCTOR:能修飾構造器
ElementType.LOCAL_VARIABLE:能修飾區域性變數
ElementType.ANNOTATION_TYPE:能修飾註解
ElementType.PACKAGE:能修飾包
2、@Retention 表示生命週期
RetentionPolicy.SOURCE: 註解只在原始碼中存在,編譯成class之後,就沒了。@Override 就是這種註解。
RetentionPolicy.CLASS: 註解在java檔案程式設計成.class檔案後,依然存在,但是執行起來後就沒了。@Retention的預設值,即當沒有顯示指定@Retention的時候,就會是這種型別。
RetentionPolicy.RUNTIME: 註解在執行起來之後依然存在,程式可以通過反射獲取這些資訊,
3、@Inherited 表示該註解具有繼承性
4、@Documented 如圖所示, 在用javadoc命令生成API文件後,DBUtil的文件裡會出現該註解說明。
5、@Repeatable 可以出現多次,見上面程式碼
多執行緒處理集合
6、很多強大的工具類
- Math:包含用於執行基本數學運算的方法,如初等指數、對數、平方根和三角函式。
- Arrays:包含用來運算元組(比如排序和搜尋)的各種方法。不支援二維陣列。
- Collections:包含用來操作集合(比如排序和搜尋)的各種方法。
- Paths:通過get()方法返回一個Path物件,Path用於表示檔案路徑和檔案。
- Files:提供了大量處理檔案的方法,例如檔案複製、讀取、寫入,獲取檔案屬性、快捷遍歷檔案目錄等....
- 紅色是java8新增
Paths 工具類 能找檔案,轉化成流過濾檔案
Files 工具類
Files 和paths 配合stream與IO流 能實現檔案過濾、查詢,與集合類轉換,改變轉換的集合類內容等等
Map的幾個新方法,常用的,但感覺還是不夠用
String類
分解
Stream 和正則結合
Steam的 chars()
但是原來的全都是 ASCII碼,我用了 來轉成 char
剩下 concurrent (正在發生的 adj ,n共點,同時發生的事件)和nashorn 沒看