1. 程式人生 > >Java新特徵學習

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 沒看