天天看點

Java 8常用的流操作

以下都是我從《java 8函數式程式設計》看到的,

collect(toList())

collect(toList())方法是由stream裡面的值生成的一個清單,是一個及早求值的操作。

List<Integer> list = Stream.of(1,2,3,4,5,).collect(Collectors.toList());

assertEquals(Arrays.asList(1,2,3,,4,5),List);

上面 程式講述的是從Stream中生成一個清單。很多Stream操作都是惰性求值,是以調用Stream上一個系列的方法之後,還需要最後調用一個類似collect的及早求值方法。

map

假設函數可以将一種類型的值轉換成另外一種類型,map操作就可以使用該函數,将流中的值轉換成一個新的流,如map将字元串轉換為大寫形式

List<String> collect = Stream.of("a","b","hello").map(String->string.toUpperCase()).collect(toList());

assertEqual(asList("A","B","HELLO"),collect);

傳給map的Lambda表達式隻接受一個String類型的參數,傳回一個新的string。參數和傳回值不必屬于同一種類型,但是lambda表達式必須是Function接口的一個執行個體。

filter

周遊資料并檢查其中的元素時,可嘗試使用stream提供新的方法

以往我們都是循環周遊清單,使用條件語句做判斷。這可以被稱為filter模式。

List<String> beginningWithNumbers = Stream.of("a","1abc","abc1").filter(value->isDigit(value.charAt(0)))

.collect(toList());

filter也是接受一個函數作為參數,該函數用Lambda表達式表示。

flatMap

flatMap方法可以用Stream替換值,然後将多個Stream連接配接成一個Stream。Map操作是用一個新的值代替Stream中的值。但是,使用者希望讓map操作有點不一樣,生成一個新的Stream對象來替換。使用者不希望結果是一連串的流,此時flatMap最能派上用場。

List<Integer> together = Stream.of(asList(1,2),asList(3,4)).flatMap(number ->numbers.stream()).collect(toList());

assertEquals(asList(1,2,3,4),together);

調用stream方法,将每個清單轉換成stream對象,其餘部分由flatMap方法處理。flatMap方法的相關函數接口和map的方法一樣,都是Functio接口,隻是方法的傳回值限定為Stream類型。