java基礎(chǔ)理論Stream管道流Map操作示例
一、回顧Stream管道流map的基礎(chǔ)用法
最簡(jiǎn)單的需求:將集合中的每一個(gè)字符串,全部轉(zhuǎn)換成大寫!
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表達(dá)式語(yǔ)法效果是一樣的
//List<String> collect = alpha.stream().map(s -> s.toUpperCase()).collect(Collectors.toList());
System.out.println(collect); //[MONKEY, LION, GIRAFFE, LEMUR]所以map函數(shù)的作用就是針對(duì)管道流中的每一個(gè)數(shù)據(jù)元素進(jìn)行轉(zhuǎn)換操作。

二、處理非字符串類型集合元素
map()函數(shù)不僅可以處理數(shù)據(jù),還可以轉(zhuǎn)換數(shù)據(jù)的類型。如下:
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等等用法
三、再?gòu)?fù)雜一點(diǎn):處理對(duì)象數(shù)據(jù)格式轉(zhuǎn)換
還是使用上一節(jié)中的Employee類,創(chuàng)建10個(gè)對(duì)象。需求如下:
- 將每一個(gè)Employee的年齡增加一歲
- 將性別中的“M”換成“male”,F(xiàn)換成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的參數(shù)e就是返回值,所以可以用peek函數(shù)。peek函數(shù)是一種特殊的map函數(shù),當(dāng)函數(shù)沒(méi)有返回值或者參數(shù)就是返回值的時(shí)候可以使用peek函數(shù)。
四、flatMap
map可以對(duì)管道流中的數(shù)據(jù)進(jìn)行轉(zhuǎn)換操作,但是如果管道中還有管道該如何處理?即:如何處理二維數(shù)組及二維集合類。實(shí)現(xiàn)一個(gè)簡(jiǎn)單的需求:將“hello”,“world”兩個(gè)字符串組成的集合,元素的每一個(gè)字母打印出來(lái)。如果不用Stream我們?cè)趺磳???層for循環(huán),第一層遍歷字符串,并且將字符串拆分成char數(shù)組,第二層for循環(huán)遍歷char數(shù)組。
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);輸出打印結(jié)果:
java.util.stream.ReferencePipeline$Head@3551a94 java.util.stream.ReferencePipeline$Head@531be3c5
用map方法是做不到的,這個(gè)需求用map方法無(wú)法實(shí)現(xiàn)。map只能針對(duì)一維數(shù)組進(jìn)行操作,數(shù)組里面還有數(shù)組,管道里面還有管道,它是處理不了每一個(gè)元素的。

flatMap可以理解為將若干個(gè)子管道中的數(shù)據(jù)全都,平面展開到父管道中進(jìn)行處理。

words.stream()
.flatMap(w -> Arrays.stream(w.split(""))) // [h,e,l,l,o,w,o,r,l,d]
.forEach(System.out::println);輸出打印結(jié)果:
h
e
l
l
o
w
o
r
d
以上就是java基礎(chǔ)理論Stream管道流Map操作示例的詳細(xì)內(nèi)容,更多關(guān)于java Stream管道流Map操作的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot 整合WebSocket 前端 uniapp 訪問(wèn)的詳細(xì)方法
這篇文章主要介紹了SpringBoot 整合WebSocket 前端 uniapp 訪問(wèn)的詳細(xì)方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09
Java數(shù)據(jù)結(jié)構(gòu)中關(guān)于AVL樹的實(shí)現(xiàn)方法詳解
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)中關(guān)于AVL樹的實(shí)現(xiàn)方法,AVL樹是高度平衡的二叉樹,它的特點(diǎn)是AVL樹中任何節(jié)點(diǎn)的兩個(gè)子樹的高度最大差別為1,本文主要給大家介紹了Java語(yǔ)言如何實(shí)現(xiàn)AVL樹,需要的朋友可以參考下2024-02-02
MyBatis SELECT基本查詢實(shí)現(xiàn)方法詳解
這篇文章主要介紹了MyBatis SELECT基本查詢實(shí)現(xiàn)方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
深入理解Mybatis中的resultType和resultMap
這篇文章給大家介紹了mybatis中的resultType和resultMap的用法實(shí)例講解,MyBatis中在查詢進(jìn)行select映射的時(shí)候,返回類型可以用resultType,也可以用resultMap,至于兩種用法區(qū)別,通過(guò)本文一起學(xué)習(xí)吧2016-09-09
Java加密解密工具(適用于JavaSE/JavaEE/Android)
這篇文章主要介紹了Java加密解密工具,適用于JavaSE/JavaEE/Android,感興趣的小伙伴們可以參考一下2016-04-04
在Mybatis @Select注解中實(shí)現(xiàn)拼寫動(dòng)態(tài)sql
這篇文章主要介紹了在Mybatis @Select注解中實(shí)現(xiàn)拼寫動(dòng)態(tài)sql,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11

