91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

For循環和While循環的區別是什么

發布時間:2021-06-15 11:04:40 來源:億速云 閱讀:276 作者:Leah 欄目:web開發

For循環和While循環的區別是什么,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

最簡單的情況是對列表中的每個元素執行操作。

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));

在這種最簡單的情況下,無論哪種方法都沒有太大優勢。但第二種方法可以不使用bare for循環,而且語法更簡潔。

我覺得forEach語句也有問題,應該只應用于副作用安全的方法。我所說的安全副作用是指不改變程序狀態。上例只是記錄日志,因此使用無礙。其他有關安全副作用的示例是寫入文件、數據庫或消息隊列。

不安全的副作用會更改程序狀態。下面為示例及其解決方法:

// 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);

另一個常見的例子:

// 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));

當你需要處理列表項方法中的索引時就會出現問題,但可以解決,如下:

// 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));

應對上述情況有一個非常簡便的lines方法,可以返回Stream類型。但是如果一個字符一個字符地讀取呢?InputStream類沒有返回Stream的方法。我們必須創建自己的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循環看起來更好。此外,Stream版本還使用了可以返回無限項目流的  generate函數,因此必須進一步檢查以確保生成過程終止,這是由于takeWhile方法的存在。

InputStream類存在問題,因為缺少peek  方法來創建可輕松轉換為Stream的Iterator。它還會拋出一個檢查過的異常,這樣函數式編程就會雜亂無章。在這種情況下可以使用while語句讓PR通過。

為了使上述問題更簡潔,可以創建一個新的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);            }         }      };   } }

這樣就大大簡化了循環問題:

// 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));

如果你經常遇到此類while循環,那么你可以創建并使用一個專門的Iterable類。但如果只用一次,就不必大費周章,這只是新舊Java不兼容的一個例子。

關于For循環和While循環的區別是什么問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南川市| 什邡市| 敖汉旗| 山阴县| 洮南市| 高平市| 碌曲县| 秦皇岛市| 佛山市| 顺昌县| 偃师市| 丰镇市| 昌黎县| 惠东县| 曲沃县| 盐津县| 讷河市| 呼图壁县| 达尔| 定兴县| 涞水县| 巩义市| 上高县| 旺苍县| 嵊泗县| 芜湖市| 平和县| 马公市| 清涧县| 临桂县| 蚌埠市| 临汾市| 梅州市| 兰西县| 同德县| 翁源县| 奉贤区| 镇巴县| 建平县| 桑日县| 宝应县|