摘要:博主有較強(qiáng)的強(qiáng)迫傾向今天強(qiáng)迫癥犯了,就想把代碼都精簡(jiǎn)了結(jié)果發(fā)現(xiàn)一個(gè)關(guān)于循環(huán)遍歷迭代器的精簡(jiǎn)的寫(xiě)法,利用邏輯代數(shù)實(shí)現(xiàn)。是通過(guò)兩個(gè)函數(shù)和函數(shù)互相配合遍歷的。不可能拋出異常或返回所以,必為。
博主有較強(qiáng)的強(qiáng)迫傾向!
今天強(qiáng)迫癥犯了,就想把代碼都精簡(jiǎn)了!
結(jié)果發(fā)現(xiàn)一個(gè)關(guān)于for循環(huán)遍歷Iterator迭代器的精簡(jiǎn)的寫(xiě)法,利用邏輯代數(shù)實(shí)現(xiàn)。
定義:
HashMapmap = new HashMap (); map.put("1","a"); map.put("2","b"); map.put("3","c"); map.put("4","d");
```java
Iterator it = map.values().iterator();//迭代器
- 一般的寫(xiě)法: ```java for (; it.hasNext(); ) System.out.println(it.next());
可惜的是, Iterator不支持這樣的寫(xiě)法,
最喜歡這種寫(xiě)法了,不用考慮結(jié)束條件,又有循環(huán)變量s可以直接使用,不用擔(dān)心多次調(diào)用next()產(chǎn)生錯(cuò)誤。
for(String s:it)//這樣是錯(cuò)的,不支持。 System.out.println(s);
所以作為一個(gè)有強(qiáng)迫傾向的人, 希望找到一種接近上述特性的寫(xiě)法。
天無(wú)絕人之路,
Java語(yǔ)言有一個(gè)我很喜歡的特性————允許在表達(dá)式中賦值!
流的IO讀寫(xiě)操作就是一個(gè)十分典型的應(yīng)用。
經(jīng)驗(yàn)告訴我,只要利用這個(gè)特性就能實(shí)現(xiàn)我的目的:
首先,明確Iterator一般是怎么遍歷的。
Iterator是通過(guò)兩個(gè)函數(shù)——hasNext()和next()函數(shù)互相配合遍歷的。
hasNext()判斷是否存在下個(gè)對(duì)象。
next()則返回下個(gè)對(duì)象并移動(dòng)游標(biāo)到下下個(gè)對(duì)象。
根據(jù)上述特性歸納一下,上述邏輯等價(jià)于:
每次循環(huán)
----hasNext()判斷
--------如果true則next()執(zhí)行一次,
--------如果false就跳出循環(huán)。
接著,想一想for(初始化語(yǔ)句; 判斷表達(dá)式; 每次循環(huán)后語(yǔ)句)的特性:
一般for的初始化語(yǔ)句用定義一個(gè)下標(biāo)變量來(lái)表示循環(huán)到哪里?
而一般的Iterator遍歷,因?yàn)橛?b>next()函數(shù)所以不用著for的初始化語(yǔ)句。
所以,
初始化語(yǔ)句可以定義下標(biāo)變量,那么也當(dāng)然可以用來(lái)定義一個(gè)循環(huán)變量!
另外,
Java允許賦值,那么上文提到的遍歷Iterator的邏輯就也可以歸納for的判斷表達(dá)式中!
最后,確定for的判斷表達(dá)式:
設(shè)表達(dá)式為A。
明顯地,A = hasNext(),才能正確地跳出循環(huán)。
并且,要在表達(dá)式A中完成一次賦值s=next()。
運(yùn)用代數(shù)邏輯,演算如下:
A = A
A = A && true
true = 包含一次賦值的表達(dá)式
一般情況,當(dāng)hasNext()為true時(shí)。next()不可能拋出異常或返回null
所以,next()!=null必為true。有:
true = (s = next()) != null
結(jié)果如下:
it.hasNext() && (s=(String) it.next()) != null
等價(jià)于 A = A && true,等價(jià)于 hasxNext(),完成了一次賦值
最終完整代碼:
HashMapmap = new HashMap (); map.put("1","a"); map.put("2","b"); map.put("3","c"); map.put("4","d"); Iterator it = map.values().iterator(); for (String s = null; it.hasNext() && (s=it.next()) != null; ) System.out.println(s);
這樣就既可以直接使用循環(huán)變量s, 又可以一行寫(xiě)完for語(yǔ)句, 實(shí)在符合我的強(qiáng)迫傾向的審美。
同時(shí)Java的表達(dá)式是短路表達(dá)式,一旦hasNext()返回是false,后續(xù)的(s = next()) != null操作就不會(huì)繼續(xù)執(zhí)行,防止遍歷到最后next()到空值而產(chǎn)生異常。
后記
當(dāng)然,這不是什么很厲害的代碼,也寫(xiě)得很啰嗦,估計(jì)沒(méi)人能靜下心,一路看到這里。
但是對(duì)于我來(lái)說(shuō)是一次很好的邏輯整理,想出這表達(dá)只用了幾分鐘,但寫(xiě)出這對(duì)文字卻用了我?guī)讉€(gè)小時(shí)(語(yǔ)言能力太差了)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64184.html
摘要:刪除元素后,立即跳出,則正常退出,但不能向后繼續(xù)循環(huán)了刪除后立馬終端循環(huán),會(huì)正常跳出,但代價(jià)是不能繼續(xù)向后循環(huán)了使用迭代器使用迭代器可,正確無(wú)誤的刪除,代碼簡(jiǎn)潔優(yōu)雅,推薦使用使用迭代器可,正確無(wú)誤的刪除注意這里時(shí)而不是 在工作中的許多場(chǎng)景下,我們都會(huì)使用到List這個(gè)數(shù)據(jù)結(jié)構(gòu),那么同樣的有很多場(chǎng)景下需要?jiǎng)h除List中的某一個(gè)元素或某幾個(gè)元素,那么我們?cè)撊绾握_無(wú)誤地刪除List中的元素...
摘要:集合框架的基本接口類層次結(jié)構(gòu)其中表示接口,表示實(shí)現(xiàn)類和在實(shí)際開(kāi)發(fā)中,需要將使用的對(duì)象存儲(chǔ)于特定數(shù)據(jù)結(jié)構(gòu)的容器中。實(shí)例是迭代器,擁有兩個(gè)方法方法迭代器用于遍歷集合元素。返回值則是轉(zhuǎn)換后的數(shù)組,該數(shù)組會(huì)保存集合中的所有元素。 Java Collections Framework是Java提供的對(duì)集合進(jìn)行定義,操作,和管理的包含一組接口,類的體系結(jié)構(gòu)。 Java集合框架的基本接口/類層次結(jié)構(gòu)...
摘要:體現(xiàn)的就是適配器模式。數(shù)組對(duì)象集合世界中的機(jī)制機(jī)制集合世界中比較常見(jiàn)的錯(cuò)誤檢測(cè)機(jī)制,防止在對(duì)集合進(jìn)行遍歷過(guò)程當(dāng)中,出現(xiàn)意料之外的修改,會(huì)通過(guò)異常暴力的反應(yīng)出來(lái)。而在增強(qiáng)循環(huán)中,集合遍歷是通過(guò)進(jìn)行的。 前言 學(xué)習(xí)情況記錄 時(shí)間:week 2 SMART子目標(biāo) :Java 容器 記錄在學(xué)習(xí)Java容器 知識(shí)點(diǎn)中,關(guān)于List的重點(diǎn)知識(shí)點(diǎn)。 知識(shí)點(diǎn)概覽: 容器中的設(shè)計(jì)模式 從Array...
摘要:我關(guān)注的賀老賀師俊前輩最近發(fā)表個(gè)這樣一條微博雖然這條微博沒(méi)有引起大范圍的關(guān)注和討論,但是作為新人,我陷入了思考。通過(guò)賀老的微博,對(duì)一個(gè)問(wèn)題進(jìn)行探究,最終找到核心成員的一文,進(jìn)行參考并翻譯。 我關(guān)注的賀老—賀師俊前輩@johnhax 最近發(fā)表個(gè)這樣一條微博: showImg(https://segmentfault.com/img/remote/1460000010452807); 雖然...
摘要:具體原因在后面說(shuō)明是必須實(shí)現(xiàn)的接口,返回了一個(gè)迭代器。迭代器,可以對(duì)已知集合進(jìn)行遍歷操作。這里可以看出,循環(huán)最終其實(shí)是會(huì)使用方法獲取迭代器,來(lái)完成遍歷。 概述 迭代器,提供了在不了解集合內(nèi)部實(shí)現(xiàn)方法的時(shí)候遍歷集合的能力??梢詫⑷萜鲀?nèi)部實(shí)現(xiàn)與遍歷操作隔離、解耦。 使用迭代器實(shí)現(xiàn)一個(gè)簡(jiǎn)單集合 通過(guò)自定義一個(gè)簡(jiǎn)單集合,并在對(duì)其使用迭代器進(jìn)行遍歷,達(dá)到掌握迭代器的目的。 集合描述 一個(gè)簡(jiǎn)單的集...
閱讀 2952·2021-10-14 09:50
閱讀 1267·2021-10-08 10:21
閱讀 3701·2021-10-08 10:16
閱讀 3108·2021-09-27 14:02
閱讀 3170·2021-09-23 11:21
閱讀 2215·2021-09-07 10:17
閱讀 435·2019-08-30 14:00
閱讀 2156·2019-08-29 17:26