[英]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));
這更好,因為:
iterate
停止說字母h
,你必須做更多的腦處理,而不僅僅是輸入h
作為rangeClosed
的上限,因為你需要找到截斷無限流的數字。 iterate
生成一個無限流,在這種特定情況下,它比具有rangeClosed
的有限流具有更多的開銷。 此外,並行運行IntStream.rangeClosed
要容易IntStream.rangeClosed
,而不是在這種特定情況下你想要的,但要記住這一點。 以下是Brian Goetz對發電機作為資料來源的一些討論。 等等...
怎么樣:
Stream.iterate('a', i -> ++i).limit(26).forEach(System.out::println);
i -> i + 1
不起作用,因為i
是一個Character
而i + 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.