1.6 類庫新特性
●java.util.stream 類庫包新特性
●java.util.Optional 類新特性
●java.util.Base64 類新特性
●Java.time 類新特性
●其它常用類新增特性
●HashMap類性能提升
1.6.1 java.util.stream 類庫包新特性
Stream流的特性
定 義:支持數據處理操作的源生成的元素序列。它並非是數據結構,也不是容器,而是一個過程.
引入的原因:1.聲明性方式處理數據集合 2.透明地並行處理,提高性能
重要特點:1. 內部迭代 2. 數據流(類似管道)傳輸
Stream數據類型
Stream流操作的分類:
1.中間操作:可以連接起來的流操作
2.終端操作:關閉流的操作,觸發流水線執行並關閉它。
特 點:一個流的操作,沒有終端操作 ,則該流中的任何中間操作操作都不會執行。
Stream流的使用:
一個數據源(如源集合)來執行一個操作(如映射).
一箇中間操作鏈(如篩選),形成一條流的流水線.
一個終端操作(如歸約),執行流水線,並能生成結果.
流的構建:
Stream流典型的接口方法:
1 filter (Predicate<? super T> predicate); 用於過濾、篩選 2 distinct(); 去重 [會依賴hasCode和equals]
3 map (Function<? super T , ? extends R> mapper);
* 對於Stream中包含的元素使用給定的轉換函數進行轉換操作,把所有的返回值組成新的流。
* 傳入User對象(User流),提取裏面的所有name屬性,轉換爲一個Strea,的流
* 新生成的Stream只包含轉換生成的元素。
Stream 流 - 收集數據:
對流調用 collect 方法將對流中的元素觸發歸約操作(由 Collector 來參數化), 將流中的元素累計成一個彙總結果。Collectors 實用類提供了許多靜態工廠方法,用來創建常見收集器的實例.
Collectors.toList() 返回類型List<T> ,把流中的所有項目收集到一個List。
Collectors.toSet() 返回類型Set<T>, 把流中的所有項目收集到一個Set。
Collectors.toCollection(Supplier collecttionFactory)返回類型Collection<T>, 把流中的所有項目收集到給定的供應源創建的集合。
Collectors.counting()方法返回的收集器,查看集合數量.如:menu.stream().collect(counting());
Collectors.maxBy(Comparator<? super T> comparator) 根據比較器,獲取最大值;
如:userLists.stream().collect(maxBy(Comparator.comparing(User::getAge)));
Collectors.minBy(Comparator<? super T> comparator) 根據比較器,獲取最小值;
Collectors.summingInt/summingDouble/summingLong() 彙總對象映射爲求和的int/Double/Long函數;
如:userLists.stream().collect(summingInt(User::getAge));
Collectors.averagingInt/averagingDouble/averagingLong() 彙總對象映射爲平均值的int/Double/Long函數;
如:userLists.stream().collect(averagingInt(User::getAge));
Collectors.joining()返回的收集器會把對流中的每一個對象應用toString()後連接成一個字符串,內部使用StringBuilder;重載:參數是分隔符. 如:userLists.stream().map(User::getAge).collect(joining(","));
Stream並行流:
1.6.2 java.util.Optional 類新特性
Optional被定義爲一個簡單的容器,其值可能是null或者不是null,Java 8之前一般某個函數應該返回非空對象但是偶爾卻可能返回了null,而在Java 8 以後,不推薦你返回null而是返回Optional。
java.util.Optional<T>,對可能缺失的值建模.引入的目的並非是要消除每一個 null引用,而是幫助你更好地設計出普適的 API.
Optional的優點
1)顯式的提醒你需要關注null的情況,對程序員是一種字面上的約束
2)將平時的一些顯式的防禦性檢測給標準化了,並提供一些可串聯操作
3)解決null會導致疑惑的概念
Optional對象的創建
empty() 聲明一個空的Optional,eg:Optional<User> optU = Optional. empty();
of(T value) 爲非null的值創建一個Optional.通過工廠方法創建Optional類。創建對象時傳入的參數不能爲nul,如果爲null,則拋出NullPointerException.
ofNullable(T value) 爲指定的值創建一個Optional,如果指定的值爲null,則返回一個空的Optional,可以接受參數爲null的情況。
常用 方法
isPresent() 如果值存在返回true,否則返回false。
get() 如果Optional有值則將其返回,否則拋出異常 NoSuchElementException。
ifPresent(Consumer<? super T> consumer) 如果Optional實例有值則爲其調用consumer,否則不做處理
orElse(T other) 如果Optional實例有值則將其返回,否則返回orElse方法傳入的參數。即參數other爲默認返回值,eg:myValue.orElse("傳入的參數value!")
orElseGet(Supplier<? extends T> other) 如果Optional實例有值則將其返回,否則調用other Lambda的get方法返回默認值,eg:myValue.orElseGet(() -> "Default Value")
orElseThrow(Supplier<? extends X> exceptionSupplier)如果有值則將其返回,否則拋出supplier接口創建的異常。eg:
public static void main(String[] args) {
try { //orElseThrow與orElse方法類似。與返回默認值不同,
//orElseThrow會拋出lambda表達式或方法生成的異常
empty.orElseThrow(ValueAbsentException::new);
} catch (Throwable ex) {
//輸出: No value present in the Optional instance
System.out.println(ex.getMessage());
}
}
class ValueAbsentException extends Throwable {
public ValueAbsentException() {super();}
public ValueAbsentException(String msg) {super(msg); }
@Override
public String getMessage() {
return "No value present in the Optional instance";
}
}
map(Function<? super T,? extends U> mapper) 如果有值,則對其執行調用mapping函數得到返回值。如果返回值不爲null,則創建包含mapping返回值的Optional作爲map方法返回值,否則返回空Optional。map方法用來對Optional實例的值執行一系列操作。通過一組實現了Function接口的lambda表達式傳入操作。eg:Optional<String> upperName = myValue.map((value) -> value.toUpperCase());
flatMap(Function<? super T,Optional<U>> mapper) 如果有值,爲其執行mapping函數返回Optional類型返回值,否則返回空Optional。flatMap與map(Funtion)方法類似,區別在於flatMap中的mapper返回值必須是Optional。調用結束時,flatMap不會對結果用Optional封裝。
filter(Predicate<? super T> predicate) 如果有值並且滿足斷言條件返回包含該值的Optional,否則返回空Optional。filter個方法通過傳入限定條件對Optional實例的值進行過濾。對於filter函數我們可以傳入實現了Predicate接口的lambda表達式。
1.6.3 java.util.Base64 類新特性
Base64已經是 JDK的標準類庫,支持Base64的編解碼。
1.6.4 Java.time 類新特性
1.6.5 其它常用類新增特性
1.6.6 HashMap類性能提升
1. 7 JAVA虛擬機(JVM)新特性
1. 8 新增工具特性
●jjs 工具:Nashorm 引擎,可以用來解析javascripts腳本
●Jdeps工具:java類的依賴分析工具。
ps:https://www.journaldev.com/2752/java-8-interface-changes-static-method-default-method