天天看點

Java核心技術卷二筆記1

第一章 Java SE 8 的流庫

對于流庫,需要關注的是做什麼而非怎麼做。

流并不存儲元素,流對集合進行操作,元素要麼是存在集合中,要麼是按需生成的。 流的操作不影響原資料。 流的操作是惰性執行的,好比spark中執行action算子時才會真正進行計算。是以可以操作無限流

通過Stream.of方法從數組建立流庫。該方法具有可變長參數,也可直接将數組元素放入參數中。

通過Array.stream(array, from, to)可以從數組中獲得左開右閉區間的元素建立一個流。

通過Stream.empty方法可以建立不含任何資料的流。

Stream.generate方法和Stream.iterate方法可以産生無限流。

flatMap方法類似于數學上的嵌套函數,首先處理外層然後處理内層。

stream.limit方法可以裁剪無限流,stream.skip方法可以丢棄前n個元素。Stream.concat方法可以連接配接兩個流。

distinct方法可以剔除流中重複元素,peek方法可以在擷取目前元素的同時調用傳入的方法。

約簡是一種終結操作,将流轉換成非流值。

count方法傳回流中元素的數量,max和min會傳回一個optional類型的最大值和最小值。

findFirst方法可以結合filter方法擷取過濾後的第一個元素,findAny則可以獲得比對的任意元素。

anyMatch方法可以告知是否存在比對,不需要結合filter方法,類似的有anyMatch,noneMatch。

Option是一種包裝器對象,要麼包裝了類型T的對象,要麼沒有包裝任何對象。

Optional對象當值不存在時根據給予的政策生成替代物。

該方法接收一個函數,若該對象存在會調用這個函數。

該方法除了接收函數之外,會傳回處理的結果。若該對象不存在則傳回的是空Optional。

對Optional對象調用get方法擷取對象并不比直接操作引用對象更安全。

同樣的,對Optional對象調用isPresent方法并不比直接檢測引用是否為空更容易處理。

Optional.of方法是根據傳入值建立對象,Optional.empty方法是建立空Optional對象,Optional.ofNullable方法是在傳入的對象不為空時傳回Optional.of方法的值,否則傳回Optional.empty方法的值。

flatMap方法可以用于鍊式處理Optional類型的對象,例如

toArray方法可以将流處理的結果存入數組中,預設類型是一個Object[]數組,為了讓數組具有正确的類型,需要傳入new方法。

另外還有個Collectors類專門用于收集元素,他的toList和toSet方法可以将元素分别放入清單和集合中。

如果想指定集合的種類,同樣要傳入new方法。

joining方法可以收集流中所有字元串,若流中包含其他類型元素,在收集前需要先使用map方法将每個元素轉換成String類型。

Summarizingxxx方法可以将流轉換成一個xxxSummaryStatistics類型對象,可以對其進行求和、數量、最大最小值等操作。

reduce方法中的一個約簡操作op在調用時就會産生vo op v1 op v2......,這項操作需要符合結合律。

其中會有一個幺元值作為計算的起點,例如0是加法的幺元值。

reduce的第三個參數可以傳入一個并行運算時執行的函數。

基本類型流就是針對基本類型int, double等的流庫,它有以下四個特點。

toArray方法傳回基本類型數組。

可選結果不再是Optional類,而是OptionalInt, OptionalLong等類。

帶有sum, max等方法。

統計資料類型也不是SummaryStatistics,而是類似IntSummaryStatistic這種類型。

Collectoin.parallelStream方法可以從任何集合中擷取一個并行流,parallel方法可以将任意的順序流轉換成并行流。

并行進行中最終要的就是要讓傳回結果和順序執行時相同,且可以以任意順序執行。

在進行流的操作時,不能修改原集合,這樣會使得流操作結果或變成未定義。