1. 程式人生 > >第五章(2)使用流-----對映

第五章(2)使用流-----對映

1.map對映的基本使用

      一個非常常見的資料處理套路就是從某些物件中選擇資訊。比如在SQL裡,你可以從表中選擇一列。Stream API也通過map和flatMap方法提供了類似的工具。

List<Dish> menu = Arrays.asList( new Dish("pork", false, 800, Dish.Type.MEAT), 
				   new Dish("beef", false, 700, Dish.Type.MEAT), 
				   new Dish("chicken", false, 400, Dish.Type.MEAT), 
				   new Dish("french fries", true, 530, Dish.Type.OTHER), 
				   new Dish("rice", true, 350, Dish.Type.OTHER), 
				   new Dish("season fruit", true, 120, Dish.Type.OTHER),
				   new Dish("pizza", true, 550, Dish.Type.OTHER),
				   new Dish("prawns", false, 300, Dish.Type.FISH), 
				   new Dish("salmon", false, 450, Dish.Type.FISH) );

List<String> dishName = menu.parallelStream().map(Dish::getName).collect(Collectors.toList());	

再比如,給定一個List<string>,要你提取每個元素的長度形成一個List:

繼續比如,我們想獲取菜品名稱的長度呢?

第二個map是提取了Stream<String>流中的字元長度。

2.陣列的流獲取

一個普通的陣列是怎麼轉換為流呢?Arrays類中提供了stream方法:

3.流的扁平化(合併)flatMap

     思考一個問題,給定單詞列表["Hello","World"],你想要返回列表["H","e","l", "o","W","r","d"]。你可能會想到下面的處理方法:

我們發現失敗了,從報錯資訊來看,split方法吧每個單詞分隔後形成了一個數組,故此時的map返回的流Stream的型別是Stream<String[]>型別的一個List列表,而我們真正想要的是Stream<String>。上面我們知道了將陣列轉換為流的方法,那麼我們現在就可以試試:

我們發現仍然不行,通過報錯資訊我們知道雖然我們把每個單詞分隔的字母形成的陣列轉換為流,但是因為是多個單詞的分隔而形成的多個數組,所以第二個map轉化出來的流是一個stream<string>的列表!

這個時候,就要有請我們的flatMap方法登場了,它可以把流的列表合併為一個:

處理的流程圖如下:

 

一道練習題:

給定兩個列表[1,2,3]和[3,4],請拼湊出[[1,3],[1,4],[2,1],[2,4],[3,3],[3,4]]

再擴充套件一次:只要兩個和能被3 整除的