版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
JCF框架JavaCollectionsFramework1內(nèi)容介紹Set接口和實(shí)現(xiàn)類List接口ArrayList實(shí)現(xiàn)類LinkedList實(shí)現(xiàn)類Collections類
隊(duì)列接口與實(shí)現(xiàn)類
棧Map接口和實(shí)現(xiàn)類
流2概念一組對(duì)象放在一起就成為一個(gè)對(duì)象“集體”。collection,agroupofobjects這組對(duì)象的組織可以是有結(jié)構(gòu)的,也可以是無結(jié)構(gòu)的如果對(duì)象間沒有前驅(qū)和后繼關(guān)系的約束,還允許有重復(fù)的對(duì)象,那么這種組織結(jié)構(gòu)就是collectioncollection沒有定義元素間的關(guān)系數(shù)據(jù)結(jié)構(gòu)線性表(list)樹(tree)圖(graph)37.1介紹JCF框架(JavaCollectionsFramework)由三部分組成:一組接口一組實(shí)現(xiàn)類一組算法JCF框架使用一組接口定義了實(shí)現(xiàn)類(功能提供者)與客戶程序(功能使用者)之間的約定。這使得客戶程序無需關(guān)心實(shí)現(xiàn)細(xì)節(jié)。這組接口不僅定義了各種各樣線性數(shù)據(jù)結(jié)構(gòu),如線性表、隊(duì)列和棧,還定義了非線性數(shù)據(jù)結(jié)構(gòu),如collection,集合。4一組接口5有序性唯一性數(shù)學(xué)術(shù)語否否包否是集合是是有序集合是否序列JCF中接口與實(shí)現(xiàn)類6Collections類JCF還定義了一組算法實(shí)現(xiàn)用于進(jìn)行查找、排序等操作。這些算法以靜態(tài)方法的形式定義在Collections類中。注意,這個(gè)類名中有“s”。7Collection接口8publicinterfaceCollection<E>extendsIterable<E>{ //基本操作//向集體中添加元素booleanadd(Eelement); //從集體中刪除參數(shù)指定的元素booleanremove(Objectelement); //判斷集體中是否包含參數(shù)指定的元素booleancontains(Objectelement); //返回集體中實(shí)際元素的數(shù)目intsize(); //如果是空集體返回truebooleanisEmpty(); //返回迭代器對(duì)象Iterator<E>iterator();
//數(shù)組操作Object[]toArray();<T>T[]toArray(T[]a);
...遍歷對(duì)容器類型的對(duì)象進(jìn)行遍歷有兩種方式:(1)使用for-each循環(huán);(2)使用迭代器Iterator。
9for-eachfor-each語句是為遍歷容器中或者數(shù)組中的元素而專門設(shè)計(jì)的一種簡潔的語句。對(duì)collection中的每個(gè)對(duì)象o,使用System.out的println方法輸出:10for(Objecto:collection){System.out.println(o);}迭代器(iterator)迭代器在封裝了collection的存儲(chǔ)結(jié)構(gòu)和存儲(chǔ)設(shè)施的前提下提供了遍歷collection的功能。也就是說,客戶程序不必關(guān)心collection的存儲(chǔ)結(jié)構(gòu)就能夠遍歷collection。迭代器對(duì)象可由Collection對(duì)象的實(shí)例方法iterator獲取,該方法返回Iterator類型的對(duì)象。11迭代器(iterator)12publicinterfaceIterator<E>{booleanhasNext(); //如果群中還有元素返回trueEnext(); //返回下個(gè)元素……}Iterator<String>iterator=collection.iterator();while(iterator.hasNext()){System.out.print(iterator.next());}算法舉例137.2Set接口和實(shí)現(xiàn)類Set類型是對(duì)數(shù)學(xué)中“集合”概念的抽象。在Set類型的容器中不允許有重復(fù)元素。也就是說,假設(shè)e1和e2都是E類型的對(duì)象,如果e1.equals(e2),那么e1和e2就不能同時(shí)放在容器中。另外,Set類型的容器至多允許有一個(gè)null元素。14Set接口的定義15publicinterfaceSet<E>extendsCollection<E>{//添加元素booleanadd(Ee);//刪除元素booleanremove(Objecto); //是否包含參數(shù)指定的元素booleancontains(Objectelement); intsize();booleanisEmpty();voidclear();
Iterator<E>iterator();
//ArrayOperationsObject[]toArray();<T>T[]toArray(T[]a);}Set接口首先繼承了Collection接口。這樣就繼承了add方法、remove方法、contains方法等。在add方法中,如果指定的參數(shù)e沒有在容器中,那么就把參數(shù)e引用的對(duì)象添加到容器中,并返回true;否則返回false,即對(duì)象未能成功加入到容器中。HashSet是JDK中提供的Set接口的一種通用實(shí)現(xiàn)HashSet如果想使用HashSet實(shí)現(xiàn)類,那么作為元素的對(duì)象必須覆蓋hashCode方法和equals方法。因?yàn)镠ashSet類使用equals方法判斷兩個(gè)元素是否重復(fù),使用hashCode方法計(jì)算哈希表使用的哈希地址。16
SetDemo.javaHashSetHashSet類型的容器所允許添加的對(duì)象必須實(shí)現(xiàn)hashCode方法和equals方法。Java默認(rèn)的哈希表的容量初始值為16(2的4次方)。假如16個(gè)存儲(chǔ)單元中的75%有數(shù)據(jù)的時(shí)候,則認(rèn)為加載因子達(dá)到默認(rèn)值0.75。這時(shí)HashSet拋棄當(dāng)前的哈希表,重新開辟一個(gè)容量為為32(2的5次方)哈希表,并重新計(jì)算安排各個(gè)對(duì)象。17集合中的元素為自定義類型的對(duì)象假設(shè)使用集合管理一組汽車對(duì)象18CarSetDemo.java注意HashSet不允許重復(fù)元素在add方法中會(huì)調(diào)用元素Car對(duì)象上的equals方法判斷是否是重復(fù)的對(duì)象hashCode方法必須和equals方法一致:equals方法判斷相等的對(duì)象的hashCode方法返回值也相等;反過來,hashCode方法返回值相等的對(duì)象的equals方法返回值未必相等。HashSet的存儲(chǔ)是無序的,沒有前后關(guān)系19集合的并、交、差B是A的子集?A.containsAll(B)不同于數(shù)學(xué)記號(hào),這里的A和B都是集合Set類型的引用變量。20SetOperatorDemo.java//C=A∪BSet<E>C=newHashSet<E>(A);C.addAll(B);
//C=A∩BSet<E>C=newHashSet<E>(A);C.retainAll(B);
//C=A-BSet<E>C=newHashSet<E>(A);C.removeAll(B);7.3List接口List接口是對(duì)線性表數(shù)據(jù)結(jié)構(gòu)的抽象。在線性表中,除了第一個(gè)元素外,每個(gè)元素都有唯一前驅(qū);除了最后一個(gè)元素外,每個(gè)元素都有唯一后繼。因此,線性表中的元素就有了位置索引。21問題:如何管理“選課名單”?增、刪、查、改數(shù)組?便于查找不便刪除22List接口23publicinterfaceList<E>extendsCollection<E>{//基本操作booleanadd(Eelement) //添加元素voidadd(intindex,Eelement) //在參數(shù)指定索引位置前插入元素booleanremove(Objecto) //刪除參數(shù)指定的元素Eremove(intindex) //刪除參數(shù)指定索引位置后的元素Eget(intindex); //讀取參數(shù)指定索引位置后的元素Eset(intindex,Eelement) //替換參數(shù)指定索引位置后的元素intsize();booleanisEmpty();List接口24//SearchintindexOf(Objecto);intlastIndexOf(Objecto);booleancontains(Objecto) //如果線性表中含有參數(shù)指定元素則返回true
//迭代器ListIterator<E>listIterator(); //不僅支持hasNext()和next()方法, //還支持hasPrevious()和previous()方法,以從后向前遍歷ListIterator<E>listIterator(intindex);
//數(shù)組操作Object[]toArray() //轉(zhuǎn)換為數(shù)組。也可用Arrays.asList(Object[])方法}add方法List接口中的add方法覆蓋了Collection接口中的add方法,聲明拋出同樣的異常。但與Set接口中的add方法不同把指定的對(duì)象添加到線性表的末尾,并且允許重復(fù)。List接口還提供了特有的基于位置索引的添加方法add(intindex,Eelement)用于在指定的位置索引index前添加對(duì)象element。25List接口remove(Objecto)刪除對(duì)象o在線性表中的第一次出現(xiàn)。remove(intindex)刪除指定位置索引index后的對(duì)象。get(intindex)返回指定位置索引index后的對(duì)象。set(intindex,Eelement)設(shè)置指定位置索引index后的對(duì)象為element。size方法返回當(dāng)前元素的個(gè)數(shù)。isEmpty方法判斷當(dāng)前容器是否為空。26List接口在查找類的方法中,除了contains方法外,還提供了特有的indexOf(Objecto)和lastIndexOf(Objecto)。前者返回指定對(duì)象o在線性表中的第一次出現(xiàn)的位置索引,后者返回指定對(duì)象o在線性表中最后一次出現(xiàn)的位置索引。如果沒有找到,則返回-1。27List接口通過listIterator方法獲取的迭代器對(duì)象不僅支持hasNext和next方法,還支持hasPrevious和previous方法,用于訪問前一個(gè)元素。subList(intfrom,intto)方法按照指定的范圍返回一個(gè)局部的線性表。28List實(shí)現(xiàn)類JCF中有兩個(gè)通用的List實(shí)現(xiàn)類ArrayList動(dòng)態(tài)順序存儲(chǔ)結(jié)構(gòu)LinkedList鏈表作為存儲(chǔ)結(jié)構(gòu)297.3.1ArrayList類ArrayList使用容量動(dòng)態(tài)可變的數(shù)組作為線性表的存儲(chǔ)結(jié)構(gòu)。每個(gè)ArrayList對(duì)象都有一個(gè)容量屬性(capacity)這個(gè)屬性表示它們所封裝的數(shù)組的容量當(dāng)添加元素超過容量限制時(shí),容量會(huì)自動(dòng)增長其默認(rèn)值為1030ArrayList的位置索引31源文件7-4ArrayListDemo.java注意一般使用接口List聲明變量,引用具體實(shí)現(xiàn)類創(chuàng)建的對(duì)象。如果List容器中有n個(gè)元素,那么有n+1個(gè)位置索引:從0到n位置add(index,element)方法把對(duì)象element插入在指定的位置索引前;其它方法,如remove方法,都是操作指定位置索引后面的元素。使用ListIterator迭代器即可以自前向后迭代,也可以自后向前迭代。僅能向Collection類型的容器中添加對(duì)象,而不能添加基本數(shù)據(jù)類型的數(shù)據(jù)。包裝類Integer把基本數(shù)據(jù)類型int包裝成對(duì)象。32LinkedList<E>LinkedList<E>內(nèi)部以鏈表來保存容器中的元素,因此隨機(jī)訪問元素時(shí)的性能較差,但在插入、刪除元素時(shí)性能較好。ArrayList<E>內(nèi)部以數(shù)組存儲(chǔ)容器中的元素,因此隨機(jī)訪問元素時(shí)的性能較好,但在插入、刪除元素時(shí)性能較差。33LinkedListExample.java7.3.2與線性表有關(guān)的算法34排序?qū)τ趦蓚€(gè)對(duì)象進(jìn)行大小比較,比如比較兩個(gè)字符串對(duì)象,就不能使用關(guān)系運(yùn)算符>。事實(shí)上,sort方法默認(rèn)去調(diào)用元素上的compareTo方法進(jìn)行比較。被比較的對(duì)象要實(shí)現(xiàn)Compareable接口。比如假設(shè)變量a和b引用了兩個(gè)字符串對(duì)象,那么就是使用pareTo(b)進(jìn)行比較:如果a小于b,那么compareTo方法返回一個(gè)負(fù)數(shù);如果a等于b,那么compareTo方法返回0;如果a大于b,那么compareTo返回一個(gè)正數(shù)。35排序Collection類型的容器要求其元素的類型必須通過實(shí)現(xiàn)Comparable接口提供compareTo()實(shí)例方法。所以,Comparable接口是Collections的靜態(tài)方法sort(客戶程序)與元素類型間的一個(gè)約定:約定對(duì)元素的比較使用compareTo方法完成。36排序String類的compareTo方法按照字符串中每個(gè)字符的Unicode碼值依次進(jìn)行大小比較。假設(shè)變量a和b引用兩個(gè)字符串對(duì)象,那么當(dāng)a和b兩個(gè)字符串中每個(gè)字符對(duì)應(yīng)相等時(shí),pareTo(b)返回0;當(dāng)a中某個(gè)字符小于b中對(duì)應(yīng)的字符時(shí),pareTo(b)返回一個(gè)負(fù)數(shù);當(dāng)a中某個(gè)字符大于b中對(duì)應(yīng)的字符時(shí),pareTo(b)返回一個(gè)正數(shù);37注意如果pareTo(b)返回0,那么a.equals(b)返回true;反過來,如果a.equals(b)返回true,那么pareTo(b)返回0。38排序由于Java已經(jīng)讓String類實(shí)現(xiàn)了Comparable接口,所以對(duì)String類型的對(duì)象就可以直接使用Collections.sort方法進(jìn)行排序。39CollectionsSortDemo.javaComparable接口Comparable接口約定了對(duì)象間的自然順序(naturalordering),Collections.sort方法自動(dòng)地調(diào)用對(duì)象上的compareTo方法進(jìn)行大小比較。如果想讓自定義類的對(duì)象也能夠使用Collections.sort方法進(jìn)行自動(dòng)排序,則該類必須實(shí)現(xiàn)Comparable接口。40Comparable接口41publicinterfaceComparable<T>{publicintcompareTo(To);}對(duì)自定義類的對(duì)象進(jìn)行排序自定義類實(shí)現(xiàn)Comparable接口;把自定義類的對(duì)象放在List容器中;使用Collections.sort排序。42CollectionsSortExample.java一致性由于compareTo方法認(rèn)為對(duì)象的weight屬性相等對(duì)象就相等,所以還得定義Car類的equals方法和hashCode方法以保持一致性。這是因?yàn)閏ompare方法返回0當(dāng)前僅當(dāng)equals方法返回true;如果equals方法返回true,hashCode方法的返回值相等43CollectionsSortSearchExample.javajava.util.Comparator接口有的情況下需要按照字典順序比較字符串而有的情況下需要僅僅比較字符串的長度,即含有字符個(gè)數(shù)多的字符串大于含有字符個(gè)數(shù)少的字符串。這就需要針對(duì)特殊應(yīng)用場(chǎng)景指定比較算法,而不是去修改Comparable的實(shí)現(xiàn)類。44ComparatorDemo.javajava.util.Comparator接口java.util.Comparator接口就是用來建立對(duì)象比較算法與算法的使用者之間的接口。java.util.Comparator接口中約定了抽象方法compare實(shí)現(xiàn)對(duì)象比較算法:intcompare(To1,To2)45java.util.Comparator接口聲明StringLengthComparator類實(shí)現(xiàn)Comparator接口時(shí)需為接口指定類型參數(shù)StringJDK7版本及以上的Comparator實(shí)現(xiàn)要滿足如下三個(gè)條件:signum(compare(x,y))==-signum(compare(y,x));如果((compare(x,y)>0)&&(compare(y,z)>0))
那么compare(x,z)>0;如果compare(x,y)==0
那么signum(compare(x,z))==signum(compare(y,z))。46設(shè)計(jì)模式對(duì)修改是封閉的;而對(duì)擴(kuò)展是開放的,稱為程序設(shè)計(jì)的“開閉原則”Comparator接口的應(yīng)用是符合開閉原則在設(shè)計(jì)模式中稱為“策略模式”477.4Queue接口和實(shí)現(xiàn)類隊(duì)列是具有先進(jìn)先出(FIFO)約束的線性表。java.util.Queue接口定義了針對(duì)隊(duì)列的一組操作。Java中的隊(duì)列接口Queue<E>沒有繼承List接口,而是直接繼承了Collection接口。針對(duì)隊(duì)列,一般需要入隊(duì)、出隊(duì)和查看隊(duì)首元素等操作48Queue接口add方法在達(dá)到容量限制時(shí)拋出IllegalStateException異常。remove方法在隊(duì)列為空時(shí)拋出NoSuchElementException異常。offer方法可能會(huì)由于容量限制而返回false;poll方法可能由于隊(duì)列為空而返回null。49實(shí)現(xiàn)類LinkedListLinkedList<E>類實(shí)現(xiàn)了Queue<E>接口因此我們可以把LinkedList當(dāng)成Queue來用。50例假設(shè)有3個(gè)人依次來到游樂園售票窗口:張三、李四、王五。那么實(shí)際上他們就依次排在一個(gè)隊(duì)列中。當(dāng)開始售票后,張三出隊(duì),買票;李四出隊(duì),買票;最后是王五出隊(duì),買票。此時(shí)隊(duì)列為空。51QueueDemo6.5棧棧是先進(jìn)后出(LIFO)的線性表。Java中并為棧沒有定義接口。由于雙端隊(duì)列Deque能夠在線性表的兩端進(jìn)行插入和刪除,所以使用Deque接口及其實(shí)現(xiàn)類能夠?qū)崿F(xiàn)棧的操作。52Deque接口Deque為棧操作定義的抽象方法53Deque54
StackDemo.java問題:如何管理“選課名單”?增、刪、查、改解決方案:線性表55問題:如何管理“選課名單”?線性表的問題平均查找時(shí)間:N/2更快的解決方案?哈希表場(chǎng)景:按學(xué)號(hào)(Key)查找學(xué)生(Value)567.6Map接口一個(gè)Map類型的容器可以看作是“鍵-值”對(duì)的集合,在這個(gè)集合中基于“鍵”存儲(chǔ)和查找“值”Map接口定義了對(duì)“鍵-值”對(duì)(key-valuepairs)進(jìn)行管理的操作無論“鍵”還是“值”,都必須是對(duì)象“鍵”就意味著不允許對(duì)象重復(fù)57Map58Map59Map接口60publicinterfaceMap<K,V>{
//基本操作Vput(Kkey,Vvalue); //添加“鍵-值”對(duì)Vget(Objectkey); //由參數(shù)指定的鍵返回相應(yīng)的值Vremove(Objectkey); //刪除參數(shù)指定鍵對(duì)應(yīng)的“鍵-值”對(duì)booleancontainsKey(Objectkey); //如果含有參數(shù)指定的鍵返回truebooleancontainsValue(Objectvalue); //如果參數(shù)指定的值至少出現(xiàn)一次,則返回trueintsize(); //返回“鍵-值”對(duì)的實(shí)際數(shù)目booleanisEmpty(); //如果沒有任何“鍵-值”對(duì),則返回truevoidclear(); //刪除所有“鍵-值”對(duì)
Map接口61//集體視圖publicSet<K>keySet(); //把所有“鍵”放在集合中返回
publicCollection<V>values(); //把所有“值”發(fā)在群中返回
//Map中元素“鍵-值”對(duì)的接口類型publicinterfaceEntry{KgetKey(); //返回“鍵”VgetValue(); //返回“值”VsetValue(Vvalue); //設(shè)置“值”}}實(shí)現(xiàn)類JCF框架中,Map接口有兩個(gè)實(shí)現(xiàn)類HashMap關(guān)心時(shí)間復(fù)雜度而并不關(guān)心元素次序TreeMap關(guān)心元素次序而并不關(guān)心時(shí)間復(fù)雜度62HashMapHashMap是Map接口的基于哈希表的實(shí)現(xiàn)HashMap容器運(yùn)行存放空鍵和空值試圖作為HashMap容器中“鍵”的對(duì)象的類型中必須實(shí)現(xiàn)hashCode方法和equals方法63添加當(dāng)使用put方法向Map集體中存放一個(gè)“鍵-值”對(duì)時(shí),put方法首先調(diào)用“鍵”對(duì)象上的hashCode方法來其在計(jì)算哈希表中的存放位置。hashCode方法的返回值并不能直接作為存放位置。假設(shè)哈希表的容量是N(2n),那么整個(gè)哈希表的元素位置索引范圍是[0,N)。put方法應(yīng)用一個(gè)映射函數(shù)把hashCode方法返回的對(duì)象哈希碼映射到[0,N)中的某個(gè)值。64參數(shù)有兩個(gè)重要的參數(shù)會(huì)影響哈希表的性能初始容量(initialcapacity)裝載因子(loadfactor)裝載因子是哈希表飽和程度的度量:length/capacitylength是哈希表中已有的元素個(gè)數(shù)capacity是哈希表的容量。默認(rèn)的裝載因子是.75,即當(dāng)哈希表中有75%的單元被使用后,put方法會(huì)再增加哈希表的容量65HashMapDemo.java總結(jié)667.7流流(stream)是從來源(source)到歸宿(sink)的元素序列(sequenceofelements)查詢平均數(shù)、標(biāo)準(zhǔn)差、最大值、最小值、小計(jì)等操作稱為聚合操作(aggregateoperations)聚合操作把多個(gè)數(shù)據(jù)變換為單個(gè)值。從Java8開始新增了包java.util.stream來解決對(duì)大數(shù)據(jù)的集體操作,例如過濾(filter)、map/reduce等,稱為流API。流API既可以串行執(zhí)行,也可以并行執(zhí)行。67流(Stream)無存儲(chǔ)的序列圖形用戶界面“單擊鼠標(biāo)”
事件流按時(shí)間順序排列的一系列事件68動(dòng)機(jī)在Java8之前,如果想對(duì)一個(gè)整數(shù)線性表中不小于90的元素求和:69privatestaticintsumList(List<Integer>list){ Iterator<Integer>it=list.iterator(); intsum=0; while(it.hasNext()){ intnum=it.next(); if(num>=90){ sum+=num; } } returnsum;}流(Stream)程序員了解過程細(xì)節(jié):獲取迭代器迭代處理線性表這種做法稱為“外部迭代”流API的做法是“內(nèi)部迭代”,使得程序更加簡潔可讀70privatestaticintsumList(List<Integer>list){ returnlist.stream().filter(p->p>=90).mapToInt(p->p).sum();}p->p>=90讀作:以每個(gè)元素p為參數(shù),計(jì)算關(guān)系表達(dá)式p>=90例使用流API計(jì)算一組成績中90及90以上成績的平均數(shù)71StreamAverageCalculator.javaLamda表達(dá)式Lamda表達(dá)式是接收參數(shù)并返回值的代碼塊(block)最簡單的Lamda表達(dá)式形如:<參數(shù)>-><表達(dá)式>根據(jù)<參數(shù)>來計(jì)算<表達(dá)式>如果需要兩個(gè)參數(shù)parameter1和parameter2,那么Lamda表達(dá)式形如:(parameter1,parameter2)-><表達(dá)式>72Lamda表達(dá)式一般地,完成復(fù)雜計(jì)算多個(gè)表達(dá)式使用一對(duì)大括號(hào){}括起來,Lamda表達(dá)式形如:(parameter1,parameter2,……)-><代碼塊>當(dāng)<代碼塊>中只有一句語句時(shí),可以省略大括號(hào){}73管道式處理通過創(chuàng)建一個(gè)Stream對(duì)象,并在其上連續(xù)應(yīng)用一系列操作,形成一個(gè)數(shù)據(jù)處理管道,稱為“管道式處理”中間操作(IntermediateOperations)篩選,排序,映射終結(jié)操作(TerminalOperations)遍歷,查找,聚合,歸約,收集(分組,分區(qū),歸約,連接,變換)也就是StreamAPI的鏈?zhǔn)秸{(diào)用這是一種聲明式程序設(shè)計(jì)風(fēng)格74StreamDemo.java例從三個(gè)字符串a(chǎn),ab,cab中查找以a打頭的字符串先把存放這三個(gè)字符串的線性表轉(zhuǎn)換為流,然后通過流上的過濾和收集操作以線性表返回結(jié)果75CollectorsDemo.java管道式處理流操作被劃分為中間操作和終結(jié)操作一個(gè)源集合一個(gè)I/O通道零個(gè)或更多的中間操作Stream.filterStream.map一個(gè)終結(jié)操作Stream.forEachStream.reduce76注意流(stream)是從來源(source)到歸宿(sink)的序列stream不存儲(chǔ)數(shù)據(jù),而是按照預(yù)定義的規(guī)則對(duì)數(shù)據(jù)進(jìn)行變換Stream不改變?cè)疵看尾僮鞫紩?huì)返回一個(gè)持有結(jié)果的新Streamstream具有延遲執(zhí)行特性:只有調(diào)用終結(jié)操作時(shí),中間操作才會(huì)執(zhí)行77注意與集體(Collection)操作不同管道化(Pipelining):多個(gè)操作可以串聯(lián),形成管道內(nèi)部迭代以前對(duì)集合遍歷都是通過Iterator或者For-Each的方式,顯式地在集合外部進(jìn)行迭代,這叫做外部迭代
Stream通過訪問者模式(Visitor)實(shí)現(xiàn)內(nèi)部迭代78順序流和并行流79例篩選奇數(shù)處理NULLOptional類是一個(gè)可以為null的容器對(duì)象如果值存在isPresent()方法會(huì)返回trueget()方法會(huì)返回該對(duì)象80查找/遍歷(find/match/foreach)已知:7,5,2,9,3,8,6,1大于6的值?81運(yùn)行結(jié)果798第一個(gè)值:7任意一個(gè)值:8是否存在:true82已知:7,5,2,9,3,8,6,1大于6的值?83已知:7,5,2,9,3,8,6,1大于6的值?1importjava.util.Optional;
2importjava.util.stream.Stream;
3importjava.util.List;
4importjava.util.ArrayList;
5
6public
classTestMatch{
7
public
static
voidmain(String[]args){
8
int[]a={7,5,2,9,3,8,6,1};
9List<Integer>list=newArrayList<>();
10
for(inte:a){
11list.add(e);
12}
13
//遍歷輸出符合條件的元素
14
list.stream().filter(x->x>6).forEach(System.out::println);
15
//查找第一個(gè)符合條件的元素
16
Optional<Integer>findFirst=list.stream().filter(x->x>6).findFirst();
17
//查找任意一個(gè)(適用于并行流)符合條件的元素
18
Optional<Integer>findAny=list.parallelStream().filter(x->x>6).findAny();
19
//判斷是否包含符合特定條件的元素
20
booleananyMatch=list.stream().anyMatch(x->x>6);
21System.out.println("第一個(gè)值:"
+findFirst.get());
22System.out.println("任意一個(gè)值:"
+findAny.get());
23System.out.println("是否存在:"
+anyMatch);
24}
25}過濾器84聚合85聚合861importjava.util.Optional;
2importjava.util.stream.Stream;
3importjava.util.List;
4importjava.util.ArrayList;
5importjava.util.Comparator;
6
7public
classTestMax{
8
public
static
voidmain(String[]args){
9
int[]a={7,25,2,9,3,8,6,54};
10List<Integer>list=newArrayList<>();
11
for(inte:a){
12list.add(e);
13}
14
//自然排序
15
Optional<Integer>max=list.stream().max(Integer::compareTo);
16
//自定義排序
17
Optional<Integer>max2=list.stream()
18.max(newComparator<Integer>(){
19@Override
20
public
intcompare(Integera,Integerb){
21
returna.toString().compareTo(b.toString());
22}
23});
24System.out.println("按整數(shù)排序的最大值:"
+max.get());
25System.out.println("按字符串排序的最大值:"
+max2.get());
26}
27}映射(map/flatMap)map:把某函數(shù)應(yīng)用到流的每個(gè)元素上,映射成新的元素,形成新流。這是一個(gè)一對(duì)一的轉(zhuǎn)換操作,不會(huì)改變流的長度,只是改變?cè)氐膬?nèi)容或類型。flatMap:把某函數(shù)應(yīng)用到流的每個(gè)元素上,映射成新流,然后把所有流連接成一個(gè)流。map88flatMap89map90每個(gè)元素+2:[9,27,4,11,5,10,8,56]1importjava.util.stream.Stream;
2importjava.util.stream.Collectors;
3importjava.util.List;
4importjava.util.ArrayList;
5
6public
classTestMap{
7
public
static
voidmain(String[]args){
8
int[]a={7,25,2,9,3,8,6,54};
9List<Integer>list=newArrayList<>();
10
for(inte:a){
11list.add(e);
12}
13List<Integer>listNew=list.stream().map(x->x+2)
14.collect(Collectors.toList());
15System.out.println("每個(gè)元素+2:"
+listNew);
16}
17}將兩個(gè)字符數(shù)組合并91合并前:[a,b,c,d,1,2,3,4]
合并后:[a,b,c,d,1,2,3,4]
1importjava.util.stream.Stream;
2importjava.util.stream.Collectors;
3importjava.util.List;
4importjava.util.ArrayList;
5importjava.util.Arrays;
6
7public
classTestFlatMap{
8
public
static
voidmain(String[]args){
9List<String>list=newArrayList<>();
10list.add("a,b,c,d");
11list.add("1,2,3,4");
12List<String>listNew=list.stream().flatMap(e->{
13
//將每個(gè)字符串元素轉(zhuǎn)換成字符數(shù)組,構(gòu)造成一個(gè)stream
14String[]s=e.split(",");
15Stream<String>s2=Arrays.stream(s);
16
returns2;
17}).collect(Collectors.toList());
18
19System.out.println("合并前:"
+list);
20System.out.println("合并后:"
+listNew);
21}
22}
23
歸約(reduce)用于將流中的元素組合起來,生成一個(gè)單一的結(jié)果。它可以實(shí)現(xiàn)從多個(gè)元素到一個(gè)單一值的聚合操作,比如求和、求最大值、求最小值等。reduce操作通常需要一個(gè)初始值以及一個(gè)BinaryOperator(二元操作符)來定義如何將兩個(gè)元素結(jié)合。
歸約(reduce)List<Integer>numbers=newArrayList()numbers.add(1);numbers.add(2);numbers.add(3);numbers.add(4);numbers.add(5);intsum=numbers.stream().reduce(0,Integer::sum);System.out.println(sum);//輸出:15931
importjava.util.List;
2
importjava.util.ArrayList;
3
importjava.util.stream.Stream;
4
importjava.util.stream.Collectors;
5
importjava.util.Optional;
6
7
public
classTestReduce{
8
public
static
voidmain(String[]args){
9List<Integer>list=newArrayList<>();
10list.add(1);list.add(2);list.add(3);
11list.add(4);list.add(5);
12
13
//通過表達(dá)式歸約求和
14
Optional<Integer>sumByExp=list.stream()
15.reduce((x,y)->x+y);
16
//通過方法調(diào)用歸約求和
17
Optional<Integer>sumByMethod=list.stream()
18.reduce(Integer::sum);
19
20
//通過表達(dá)式歸約求最大值
21
Optional<Integer>maxByExp=list.stream()
22.reduce((x,y)->x>y?x:y);
23
//通過方法調(diào)用求最大值
24
IntegermaxByMethod=list.stream()
25.reduce(1,(x,y)->Integer.max(x,y));
26
27System.out.println("和:"
+sumByExp.get()+","
28+sumByMethod.get());
29System.out.println("最大值:"
+maxByExp.get()+","
30+maxByMethod);
31}
32}
33
3494求一組整數(shù)之和、乘積和最大值toList因?yàn)榱鞑淮鎯?chǔ)數(shù)據(jù),那么在流中的數(shù)據(jù)完成處理后,需要將流中的數(shù)據(jù)重新歸集到新的集合里toList、toSet和toMap比較常用另外還有toCollection、toConcurrentMap等復(fù)雜一些的用法95961importjava.util.List;
2importjava.util.Arrays;
3importjava.util.Set;
4importjava.util.stream.Collectors;
5public
classTestCollectors{
6
public
static
voidmain(String[]args){
7List<Integer>list=newArrayList();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);
8List<Integer>listNew=list.stream().filter(x->x%2==0).collect(Collectors.toList());
9Set<Integer>set=list.stream().filter(x->x%2==0).collect(Collectors.toSet());
10System.out.println("toList:"+listNew);
11System.out.println("toSet:"+set);
12
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 餐飲服務(wù)突發(fā)公共衛(wèi)生事件運(yùn)行的應(yīng)急方案
- 2025年二級(jí)樂理考試試題及答案
- 院子圍墻施工方案(3篇)
- 銅礦選礦項(xiàng)目申請(qǐng)報(bào)告
- 2025年高級(jí)經(jīng)濟(jì)師《財(cái)稅、建筑、農(nóng)業(yè)》真題(含答案)
- 住宅滲水施工方案(3篇)
- 市政施工方案排序(3篇)
- 土石基礎(chǔ)施工方案(3篇)
- 臥室地磚施工方案(3篇)
- 護(hù)欄清理施工方案(3篇)
- 珠海市紀(jì)委監(jiān)委公開招聘所屬事業(yè)單位工作人員12人考試題庫附答案
- 2025內(nèi)蒙古鄂爾多斯東勝區(qū)消防救援大隊(duì)招聘鄉(xiāng)鎮(zhèn)(街道)消防安全服務(wù)中心專職工作人員招聘3人考試筆試模擬試題及答案解析
- 2025濟(jì)寧市檢察機(jī)關(guān)招聘聘用制書記員(31人)筆試考試參考試題及答案解析
- 2025年安全總監(jiān)年終總結(jié)報(bào)告
- 安順市人民醫(yī)院招聘聘用專業(yè)技術(shù)人員筆試真題2024
- 廚師專業(yè)職業(yè)生涯規(guī)劃與管理
- 2025年10月自考00688設(shè)計(jì)概論試題及答案
- 六西格瑪設(shè)計(jì)實(shí)例
- 海南檳榔承包協(xié)議書
- 工業(yè)交換機(jī)產(chǎn)品培訓(xùn)
- 2025浙江溫州市龍港市國有企業(yè)招聘產(chǎn)業(yè)基金人員3人筆試歷年備考題庫附帶答案詳解試卷3套
評(píng)論
0/150
提交評(píng)論