簡體   English   中英

使用Java流將字母從A打印到Z.

[英]Printing the letters from A to Z using a Java stream

我有這個代碼,但它給了我一個錯誤:

類型不匹配:無法從int轉換為Character

Stream.iterate('a', i -> i + 1).limit(26).forEach(System.out::println);

雖然可以寫int i = 'a';

我知道我可以像這樣寫它,但對於一個簡單的任務來說,這似乎太多了。

Stream.iterate('a', i -> (char)(i + 1)).limit(26).forEach(System.out::println);

為什么Java類型推斷失敗?

i -> i + 1不編譯的原因是因為你試圖隱式地int轉換為編譯器不能單獨執行的Character

換句話說,您可以將Stream.iterate('a', i -> i + 1)視為:

Stream.iterate('a', (Character i) -> {
       int i1 = i + 1;  
       return i1; // not possible 
});

如你所知, 顯式轉換為char解決了它:

Stream.iterate('a', i -> (char)(i + 1))...

順便說一句,這樣做更好:

IntStream.rangeClosed('a', 'z').forEach(c -> System.out.println((char)c));

這更好,因為:

  1. 沒有拳擊開銷因此更有效率
  2. 如果你在使用iterate停止說字母h ,你必須做更多的腦處理,而不僅僅是輸入h作為rangeClosed的上限,因為你需要找到截斷無限流的數字。
  3. 隨着拳擊iterate生成一個無限流,在這種特定情況下,它比具有rangeClosed有限流具有更多的開銷。 此外,並行運行IntStream.rangeClosed要容易IntStream.rangeClosed ,而不是在這種特定情況下你想要的,但要記住這一點。 以下是Brian Goetz對發電機作為資料來源的一些討論。

等等...

怎么樣:

Stream.iterate('a', i -> ++i).limit(26).forEach(System.out::println);

i -> i + 1不起作用,因為i是一個Characteri + 1導致隱式縮小轉換( JLS 5.1.3 ),這是不允許的。 您可以按照顯示的方式顯式地投射它。 但是++i工作原因是(來自JLS 15.15.1 ):

在添加之前,對值1和變量的值執行二進制數字提升(第5.6.2節)。 如果必要,在存儲之前,通過縮小的基元轉換(第5.1.3節)和/或經過裝箱轉換(第5.1.7節)將總和縮小到變量的類型。

++運算符負責縮小轉換,而無需顯式轉換它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM