一、回顧Stream管道流map的基礎用法
最簡單的需求:將集合中的每一個字串,全部轉換成大寫!
List<String> alpha = Arrays.asList("Monkey", "Lion", "Giraffe", "Lemur");
//不使用Stream管道流
List<String> alphaUpper = new ArrayList<>();
for (String s : alpha) {
alphaUpper.add(s.toUpperCase());
}
System.out.println(alphaUpper); //[MONKEY, LION, GIRAFFE, LEMUR]
// 使用Stream管道流
List<String> collect = alpha.stream().map(String::toUpperCase).collect(Collectors.toList());
//上面使用了方法參考,和下面的lambda運算式語法效果是一樣的
//List<String> collect = alpha.stream().map(s -> s.toUpperCase()).collect(Collectors.toList());
System.out.println(collect); //[MONKEY, LION, GIRAFFE, LEMUR]
所以map函式的作用就是針對管道流中的每一個資料元素進行轉換操作,

二、處理非字串型別集合元素
map()函式不僅可以處理資料,還可以轉換資料的型別,如下:
List<Integer> lengths = alpha.stream()
.map(String::length)
.collect(Collectors.toList());
System.out.println(lengths); //[6, 4, 7, 5]
Stream.of("Monkey", "Lion", "Giraffe", "Lemur")
.mapToInt(String::length)
.forEach(System.out::println);
輸出如下:
6
4
7
5
除了mapToInt,還有maoToLong,mapToDouble等等用法
三、再復雜一點:處理物件資料格式轉換
還是使用上一節中的Employee類,創建10個物件,需求如下:
- 將每一個Employee的年齡增加一歲
- 將性別中的“M”換成“male”,F換成Female,
public static void main(String[] args){
Employee e1 = new Employee(1,23,"M","Rick","Beethovan");
Employee e2 = new Employee(2,13,"F","Martina","Hengis");
Employee e3 = new Employee(3,43,"M","Ricky","Martin");
Employee e4 = new Employee(4,26,"M","Jon","Lowman");
Employee e5 = new Employee(5,19,"F","Cristine","Maria");
Employee e6 = new Employee(6,15,"M","David","Feezor");
Employee e7 = new Employee(7,68,"F","Melissa","Roy");
Employee e8 = new Employee(8,79,"M","Alex","Gussin");
Employee e9 = new Employee(9,15,"F","Neetu","Singh");
Employee e10 = new Employee(10,45,"M","Naveen","Jain");
List<Employee> employees = Arrays.asList(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10);
/*List<Employee> maped = employees.stream()
.map(e -> {
e.setAge(e.getAge() + 1);
e.setGender(e.getGender().equals("M")?"male":"female");
return e;
}).collect(Collectors.toList());*/
List<Employee> maped = employees.stream()
.peek(e -> {
e.setAge(e.getAge() + 1);
e.setGender(e.getGender().equals("M")?"male":"female");
}).collect(Collectors.toList());
System.out.println(maped);
}
由于map的引數e就是回傳值,所以可以用peek函式,peek函式是一種特殊的map函式,當函式沒有回傳值或者引數就是回傳值的時候可以使用peek函式,
四、flatMap
map可以對管道流中的資料進行轉換操作,但是如果管道中還有管道該如何處理?即:如何處理二維陣列及二維集合類,實作一個簡單的需求:將“hello”,“world”兩個字串組成的集合,元素的每一個字母列印出來,如果不用Stream我們怎么寫?寫2層for回圈,第一層遍歷字串,并且將字串拆分成char陣列,第二層for回圈遍歷char陣列,
List<String> words = Arrays.asList("hello", "word");
words.stream()
.map(w -> Arrays.stream(w.split(""))) //[[h,e,l,l,o],[w,o,r,l,d]]
.forEach(System.out::println);
輸出列印結果:
java.util.stream.ReferencePipeline$Head@3551a94
java.util.stream.ReferencePipeline$Head@531be3c5
- 用map方法是做不到的,這個需求用map方法無法實作,map只能針對一維陣列進行操作,陣列里面還有陣列,管道里面還有管道,它是處理不了每一個元素的,

- flatMap可以理解為將若干個子管道中的資料全都,平面展開到父管道中進行處理,

words.stream()
.flatMap(w -> Arrays.stream(w.split(""))) // [h,e,l,l,o,w,o,r,l,d]
.forEach(System.out::println);
輸出列印結果:
h
e
l
l
o
w
o
r
d
歡迎關注我的博客,里面有很多精品合集
- 本文轉載注明出處(必須帶連接,不能只轉文字):字母哥博客,
覺得對您有幫助的話,幫我點贊、分享!您的支持是我不竭的創作動力! ,另外,筆者最近一段時間輸出了如下的精品內容,期待您的關注,
- 《手摸手教你學Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《實戰前后端分離RBAC權限管理系統》
- 《實戰SpringCloud微服務從青銅到王者》
- 《VUE深入淺出系列》
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/160755.html
標籤:Java
上一篇:優秀原始碼帶給我們的一些啟示
下一篇:JSON是什么,為什么這么流行?
