Java中的流式編程問(wèn)題
注意:這個(gè)特效是在Java8之后才引進(jìn)的 就是說(shuō) jdk8之前是沒(méi)有的
一. 基本概念
1.1 為什么加入 集合的流式操作
JDK8 的Stream 是一個(gè)受到 函數(shù)式編程 和 多核時(shí)代影響而產(chǎn)生的東西。很多時(shí)候我們需要到底層返回?cái)?shù)據(jù),上層再對(duì)數(shù)據(jù)進(jìn)行遍歷,進(jìn)行一些數(shù)據(jù)統(tǒng)計(jì),但是之前的Java API 中很少有這種方法,這就需要我們自己來(lái) Iterator 來(lái)遍歷,如果JDK 能夠?yàn)槲覀兲峁┮恍┻@種方法,并且能夠?yàn)槲覀儍?yōu)化就好了。
所以JDK8加入 了 java.util.stream包,實(shí)現(xiàn)了集合的流式操作,流式操作包括集合的過(guò)濾,排序,映射等功能。根據(jù)流的操作性,又可以分為 串行流 和 并行流。
根據(jù)操作返回的結(jié)果不同,流式操作又分為中間操作和最終操作。大大方便了我們對(duì)于集合的操作。
- 最終操作:返回一特定類型的結(jié)果。
- 中間操作:返回流本身。
1.2 什么是流
Stream 不是 集合元素,也不是數(shù)據(jù)結(jié)構(gòu),它相當(dāng)于一個(gè) 高級(jí)版本的 Iterator,不可以重復(fù)遍歷里面的數(shù)據(jù),像水一樣,流過(guò)了就一去不復(fù)返。
它和普通的 Iterator 不同的是,它可以并行遍歷,普通的 Iterator 只能是串行,在一個(gè)線程中執(zhí)行。
二. 串行流和并行流
串行流操作在一個(gè)線程中依次完成。
并行流在多個(gè)線程中完成,主要利用了 JDK7 的 Fork/Join 框架來(lái)拆分任務(wù)和加速處理。
相比串行流,并行流可以很大程度提高程序的效率。
三. 中間操作和最終操作
中間操作:
- filter(): 對(duì)元素進(jìn)行過(guò)濾
- sorted():對(duì)元素排序
- map():元素映射
- distinct():去除重復(fù)的元素
最終操作:
- forEach():遍歷每個(gè)元素。
- reduce():把Stream 元素組合起來(lái)。例如,字符串拼接,數(shù)值的 sum,min,max ,average 都是特殊的 reduce。
- collect():返回一個(gè)新的集合。
- min():找到最小值。
- max():找到最大值。
廢話不多說(shuō) 直接上代碼:
public static void main(String[] args) { List<String> list = new ArrayList(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); list.add("d"); list.add("d"); list.add("d"); list.add("d"); list.add("d"); list.add("e"); list.add("f"); list.add("aa"); list.add("faaa"); System.out.println("----對(duì)集合數(shù)據(jù)的過(guò)濾,根據(jù)給到的條件篩選過(guò)濾----"); list.stream().filter(param -> !param.contains("a")).forEach(System.out::println); System.out.println("----對(duì)集合數(shù)據(jù)進(jìn)行排序,默認(rèn)的是升序排列----"); list.stream().sorted().forEach(System.out::println); System.out.println("----自定義排序方式----");//注:這里是通過(guò) Stream<T> sorted(Comparator<? super T> comparator); 這個(gè)方法 list.stream().sorted((p1,p2) -> p1.hashCode() <p2.hashCode() ? 1 : -1).forEach(System.out::println); System.out.println("----對(duì)于集合的每個(gè)元素可以按照規(guī)則變成相應(yīng)的元素,這里是把包含a的元素替換成了1,其他的不變----"); list.stream().map(param -> param.contains("a") ? 1 : param).forEach(System.out ::println); System.out.println("----對(duì)于集合中重復(fù)的數(shù)據(jù)進(jìn)行去重,把相同的數(shù)據(jù)去除,這里去除了d的重復(fù)元素----"); list.stream().distinct().forEach(System.out ::println); System.out.println("----reduce是把集合里的數(shù)據(jù)組合起來(lái),這里是把所有的元素組合成一個(gè)新的字符串----"); System.out.println(list.stream().reduce((p1,p2) -> p1+p2).get()); System.out.println("----collect是將原先的集合數(shù)據(jù)根據(jù)給定的條件篩選重新生成一個(gè)新的list集合返回----"); list.stream().filter(p -> !p.contains("a")).collect(Collectors.toList()).forEach(System.out::println); }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java?I/O?(Input/Output)文件字節(jié)流舉例詳解
Java的輸入輸出流(IO)是用于與外部設(shè)備(如文件、網(wǎng)絡(luò)連接等)進(jìn)行數(shù)據(jù)交互的機(jī)制,下面這篇文章主要給大家介紹了關(guān)于Java?I/O?(Input/Output)文件字節(jié)流的相關(guān)資料,需要的朋友可以參考下2024-08-08淺談Android開(kāi)發(fā)中項(xiàng)目的文件結(jié)構(gòu)及規(guī)范化部署建議
這篇文章主要介紹了Android開(kāi)發(fā)中項(xiàng)目的文件結(jié)構(gòu)及規(guī)范化部署建議,組織好代碼文件的結(jié)構(gòu)有利于維護(hù)團(tuán)隊(duì)合作的效率,需要的朋友可以參考下2016-03-03springboot項(xiàng)目test文件夾下帶main方法的類不能運(yùn)行問(wèn)題
這篇文章主要介紹了springboot項(xiàng)目test文件夾下帶main方法的類不能運(yùn)行問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11Mybatis中的@Param及動(dòng)態(tài)SQL詳解
這篇文章主要介紹了Mybatis中的@Param及動(dòng)態(tài)SQL詳解,@Param是MyBatis所提供的作為Dao層的注解,作用是用于傳遞參數(shù),從而可以與SQL中的的字段名相對(duì)應(yīng),需要的朋友可以參考下2023-10-10springboot業(yè)務(wù)功能實(shí)戰(zhàn)之告別輪詢websocket的集成使用
WebSocket使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡(jiǎn)單,允許服務(wù)端主動(dòng)向客戶端推送數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于springboot業(yè)務(wù)功能實(shí)戰(zhàn)之告別輪詢websocket的集成使用,需要的朋友可以參考下2022-10-10