成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[DanoR][Java代碼][邏輯精簡(jiǎn)::for循環(huán)遍歷Iterator迭代器]

YacaToy / 1555人閱讀

摘要:博主有較強(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)。

定義:

HashMap map = 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()判斷
--------如果truenext()執(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(),完成了一次賦值

最終完整代碼:

        HashMap map = 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

相關(guān)文章

  • Java中如何優(yōu)雅地刪除List中的元素

    摘要:刪除元素后,立即跳出,則正常退出,但不能向后繼續(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中的元素...

    kelvinlee 評(píng)論0 收藏0
  • 集合概要學(xué)習(xí)---粗略

    摘要:集合框架的基本接口類層次結(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)...

    DesGemini 評(píng)論0 收藏0
  • 帶你了解集合世界的fail-fast機(jī)制 和 CopyOnWriteArrayList 源碼詳解

    摘要:體現(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...

    young.li 評(píng)論0 收藏0
  • 從賀老微博引出的“遍歷Iterators)加速那些奧秘”

    摘要:我關(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); 雖然...

    XUI 評(píng)論0 收藏0
  • 一篇文章看懂java迭代

    摘要:具體原因在后面說(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)單的集...

    kyanag 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<