成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

For循環(huán)和While循環(huán)的區(qū)別是什么

For循環(huán)和While循環(huán)的區(qū)別是什么,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。

為華鎣等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及華鎣網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、華鎣網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

最簡(jiǎn)單的情況是對(duì)列表中的每個(gè)元素執(zhí)行操作。

List<Integer> list = List.of(1, 2, 3); // bare for loop.  for(int i : list) {    System.out.println("int = "+ i); }// controlled for each list.forEach(i -> System.out.println("int = " + i));

在這種最簡(jiǎn)單的情況下,無論哪種方法都沒有太大優(yōu)勢(shì)。但第二種方法可以不使用bare for循環(huán),而且語法更簡(jiǎn)潔。

我覺得forEach語句也有問題,應(yīng)該只應(yīng)用于副作用安全的方法。我所說的安全副作用是指不改變程序狀態(tài)。上例只是記錄日志,因此使用無礙。其他有關(guān)安全副作用的示例是寫入文件、數(shù)據(jù)庫或消息隊(duì)列。

不安全的副作用會(huì)更改程序狀態(tài)。下面為示例及其解決方法:

// bad side-effect, the loop alters sum int sum = 0; for(int i : list) {     sum += i; } System.out.println("sum = " + sum);// no side-effect, sum iscalculated by loop sum = list        .stream()        .mapToInt(i -> i)        .sum(); System.out.println("sum = " + sum);

另一個(gè)常見的例子:

// bad side-effect, the loop alters list2 List<Integer> list2 = new ArrayList<>(); for(int i : list) {    list2.add(i); } list2.forEach(i -> System.out.println("int = " + i));// no sideeffect, the second list is built by the loop list2 = list          .stream()          .collect(Collectors.toList()); list2.forEach(i -> System.out.println("int = " + i));

當(dāng)你需要處理列表項(xiàng)方法中的索引時(shí)就會(huì)出現(xiàn)問題,但可以解決,如下:

// bare for loop with index: for(int i = 0; i < list.size(); i++) {     System.out.println("item atindex "        + i        + " = "        + list.get(i)); }// controlled loop with index: IntStream.range(0, list.size())    .forEach(i ->System.out.println("item at index "     + i     + " = "     + list.get(i)));

老生常談的問題:讀取文件中的每一行直到文件讀取完畢如何解決?

BufferedReader reader = new BufferedReader(        new InputStreamReader(       LoopElimination.class.getResourceAsStream("/testfile.txt"))); // while loop with clumsy looking syntax String line; while((line = reader.readLine()) != null) {    System.out.println(line); }reader = new BufferedReader(        new InputStreamReader(       LoopElimination.class.getResourceAsStream("/testfile.txt"))); // less clumsy syntax reader.lines()    .forEach(l ->System.out.println(l));

應(yīng)對(duì)上述情況有一個(gè)非常簡(jiǎn)便的lines方法,可以返回Stream類型。但是如果一個(gè)字符一個(gè)字符地讀取呢?InputStream類沒有返回Stream的方法。我們必須創(chuàng)建自己的Stream:

InputStream is =    LoopElimination.class.getResourceAsStream("/testfile.txt"); // while loop with clumsy looking syntax int c; while((c = is.read()) != -1) {   System.out.print((char)c); } // But this is even uglier InputStream nis =    LoopElimination.class.getResourceAsStream("/testfile.txt"); // Exception handling makes functional programming ugly Stream.generate(() -> {    try {       return nis.read();    } catch (IOException ex) {       throw new RuntimeException("Errorreading from file", ex);    } })  .takeWhile(ch -> ch != -1)  .forEach(ch ->System.out.print((char)(int)ch));

這種情況下while循環(huán)看起來更好。此外,Stream版本還使用了可以返回?zé)o限項(xiàng)目流的  generate函數(shù),因此必須進(jìn)一步檢查以確保生成過程終止,這是由于takeWhile方法的存在。

InputStream類存在問題,因?yàn)槿鄙賞eek  方法來創(chuàng)建可輕松轉(zhuǎn)換為Stream的Iterator。它還會(huì)拋出一個(gè)檢查過的異常,這樣函數(shù)式編程就會(huì)雜亂無章。在這種情況下可以使用while語句讓PR通過。

為了使上述問題更簡(jiǎn)潔,可以創(chuàng)建一個(gè)新的IterableInputStream類型,如下:

static class InputStreamIterable implements Iterable<Character> {   private final InputStream is;   public InputStreamIterable(InputStreamis) {     this.is = is;   }   public Iterator<Character>iterator() {      return newIterator<Character>() {                       public boolean hasNext() {            try {              // poor man's peek:              is.mark(1);              boolean ret = is.read() !=-1;              is.reset();              return ret;            } catch (IOException ex) {              throw new RuntimeException(                     "Error readinginput stream", ex);            }         }         public Character next() {            try {              return (char)is.read();            } catch (IOException ex) {              throw new RuntimeException(                    "Error readinginput stream", ex);            }         }      };   } }

這樣就大大簡(jiǎn)化了循環(huán)問題:

// use a predefined inputstream iterator: InputStreamIterable it = new InputStreamIterable(     LoopElimination.class.getResourceAsStream("/testfile.txt")); StreamSupport.stream(it.spliterator(), false)    .forEach(ch -> System.out.print(ch));

如果你經(jīng)常遇到此類while循環(huán),那么你可以創(chuàng)建并使用一個(gè)專門的Iterable類。但如果只用一次,就不必大費(fèi)周章,這只是新舊Java不兼容的一個(gè)例子。

關(guān)于For循環(huán)和While循環(huán)的區(qū)別是什么問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

本文題目:For循環(huán)和While循環(huán)的區(qū)別是什么
文章分享:http://jinyejixie.com/article16/iepgdg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名網(wǎng)站改版、小程序開發(fā)品牌網(wǎng)站設(shè)計(jì)、響應(yīng)式網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作
宁阳县| 普兰店市| 南漳县| 南平市| 乌拉特后旗| 宝山区| 龙南县| 成都市| 涞水县| 北宁市| 苍南县| 吴桥县| 吴桥县| 会泽县| 柳江县| 德州市| 长海县| 买车| 恩平市| 成武县| 阜宁县| 石河子市| 正宁县| 涟水县| 剑河县| 梅河口市| 阿坝| 蒙阴县| 达日县| 和林格尔县| 连山| 来安县| 抚州市| 象州县| 吐鲁番市| 新余市| 永胜县| 罗甸县| 麦盖提县| 门源| 宁晋县|