java8新特性 stream流的方式遍歷集合和數(shù)組操作
前言:
在沒有接觸java8的時候,我們遍歷一個集合都是用循環(huán)的方式,從第一條數(shù)據(jù)遍歷到最后一條數(shù)據(jù),現(xiàn)在思考一個問題,為什么要使用循環(huán),因為要進行遍歷,但是遍歷不是唯一的方式,遍歷是指每一個元素逐一進行處理(目的),而并不是從第一個到最后一個順次處理的循環(huán),前者是目的,后者是方式。 所以為了讓遍歷的方式更加優(yōu)雅,出現(xiàn)了流(stream)!
1.流的目的在于強掉做什么
假設(shè)一個案例:將集合A根據(jù)條件1過濾為子集B,然后根據(jù)條件2過濾為子集C
在沒有引入流之前我們的做法可能為:
public class Demo02NormalFilter { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("張無忌"); list.add("周芷若"); list.add("趙敏"); list.add("張強"); list.add("張三豐"); List<String> zhangList = new ArrayList<>(); for (String name : list) { if (name.startsWith("張")) { zhangList.add(name); } } List<String> shortList = new ArrayList<>(); for (String name : zhangList) { if (name.length() == 3) { shortList.add(name); } } for (String name : shortList) { System.out.println(name); } } }
現(xiàn)在以流的方式實現(xiàn)同樣的功能:
public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("張無忌"); list.add("周芷若"); list.add("趙敏"); list.add("張強"); list.add("張三豐"); list.stream().filter(s->s.startsWith("張")).filter(s-> s.length() == 3).forEach(System.out::println);
從上面的兩段代碼可以看出流的存在讓代碼更加優(yōu)雅。既然是篩選那么就直接用過濾方法就好了。
2.stream的方法
2.1 延遲方法:
這個和lambda表達式的延遲加載的原理一樣,它可以進行鏈式編程,比如 ().filter().map().limit(),可以點下去,到最后一步(方法為count或者foreach)加載數(shù)據(jù)。這里主要介紹map和concat方法
1.filter,用來過濾
Stream<String> original = Stream.of("張無忌", "張三豐", "周芷若"); Stream<String> result = original.filter(s -> s.startsWith("張")); result.forEach(name-> System.out.println(name));
2.map
將流中的元素映射到另一個流中,這個是在后期經(jīng)常用到的,比如方法所接收的返回值是A,但是接收的卻是B
這里舉兩個例子
例子1
將String類型的流轉(zhuǎn)換為Integer 類型
Stream<String> stringStream = Stream.of("1", "2", "3", "4", "5", "6");
stringStream.map(str->Integer.parseInt(str)).forEach(System.out::println);
例子2
方法需要返回的是List <String>,但是這里只有List<Category>,此時就要想到stream().map
public List<String> queryNamesByIds(List<Long> ids){ List<Category> categories = this.categoryMapper.selectByIdList(ids); return categories.stream().map(category -> category.getName()).collect(Collectors.toList()); }
例子3
List<Object>轉(zhuǎn)化為List<Cart>,其中List<Object>中的Object為Cart的json對象 //查詢購物車數(shù)據(jù)(將List<Object>變成List<Cart>) return carts.stream().map(o -> JsonUtils.parse(o.toString(),Cart.class)).collect(Collectors.toList());
3.contract,兩個流合并成一個流
Stream<String> streamA = Stream.of("張無忌","張翠山"); Stream<String> streamB = Stream.of("美羊羊","喜羊羊"); //寫法1 //Stream.concat(streamA, streamB).forEach(System.out::println); //寫法2 Stream<String> result= Stream.concat(streamA, streamB); result.forEach(name-> System.out.println(name));
2.2 終結(jié)方法:
執(zhí)行完的結(jié)果不能在調(diào)用延遲方法。 如 ().filter().count().limit()這樣的寫法就會報錯。
cout方法與foreach方法比較簡單,這里不介紹了。
補充知識:JAVA Stream流的forEach遍歷
Stream流的forEach:
如果希望在流當中進行元素的遍歷操作,可以使用forEach方法:
forEach(Lambda)表達式,對每一個元素都要進行操作。
參數(shù)Lambda表達式必須是一個能夠消費的一個參數(shù),而且不產(chǎn)生數(shù)據(jù)結(jié)果的Lambda
例如:
Lambda: s -> System.out.println(s);
方法引用:System::println
println其為不會產(chǎn)生返回結(jié)果的Lambda
例如:對集合中每個元素的打印輸出:
public class StreamForEach { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("abc"); list.add("def"); list.add("ghi"); Stream<String> streamA = list.stream(); // 對每一個元素進行打印輸出 streamA.forEach((String s) -> { System.out.println(s); }); list.stream().forEach(s -> System.out.println(s)); list.stream().forEach(System.out::println); } }
以上這篇java8新特性 stream流的方式遍歷集合和數(shù)組操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決Springboot啟動報錯:類文件具有錯誤的版本61.0,應(yīng)為?52.0
這篇文章主要給大家介紹了關(guān)于解決Springboot啟動報錯:類文件具有錯誤的版本?61.0,應(yīng)為?52.0的相關(guān)資料,這是查閱了網(wǎng)上的很多資料才解決的,分享給大家,需要的朋友可以參考下2023-01-01SpringBoot使用Spring?Cache高效處理緩存數(shù)據(jù)
Spring?Cache是一個框架,只要簡單加一個注解,就能實現(xiàn)緩存功能,本文主要介紹了SpringBoot使用Spring?Cache高效處理緩存數(shù)據(jù),感興趣的可以了解一下2023-11-11MyBatis-Plus動態(tài)表名使用selectPage方法不生效問題解析與解決方案
MyBatis-Plus是MyBatis的增強工具,動態(tài)表名是MyBatis-Plus的一個重要功能之一,一些開發(fā)者在使用selectPage方法時可能會遇到動態(tài)表名不生效的問題,本文將深入分析這個問題的原因,并提供相應(yīng)的解決方案,需要的朋友可以參考下2023-12-12解決Spring JPA 使用@transaction注解時產(chǎn)生CGLIB代理沖突問題
這篇文章主要介紹了解決Spring JPA 使用@transaction注解時產(chǎn)生CGLIB代理沖突問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08BufferedWriter如何使用write方法實現(xiàn)換行
這篇文章主要介紹了BufferedWriter如何使用write方法實現(xiàn)換行的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07