在Java 8中,stream.generate()是一個非常強大的函數,它可以讓我們創建一個無限或有限的stream,這個stream會得益於一個提供了無限元素的Supplier。在這篇文章中,我們將會從多個方面對stream.generate()進行詳細的闡述。
一、創建無限stream
Stream.generate(() -> "random").forEach(System.out::println);
如上述代碼所示,使用stream.generate()函數來創建一個無限的stream,傳入一個lambda表達式,這個lambda表達式的功能是返回一個字元串”random”,然後我們使用forEach()函數來列印出stream中的每一個元素。因為Supplier是無限提供元素的,所以這個stream會一直運行下去,直到程序強制終止為止。
當我們創建無限stream時,謹慎使用limit()函數是非常重要的。如果我們沒有使用limit()函數來限制stream元素的數量,那麼stream會無休止地運行下去,這會佔用很多內存空間並導致程序崩潰。
二、創建有限stream
Stream.generate(Math::random).limit(5).forEach(System.out::println);
如上述代碼所示,我們可以使用limit()函數來限制stream元素的數量,這裡我們創建了一個有限stream,限制stream有5個元素。這個stream的元素是使用Math.random()函數生成的隨機數字。運行結果如下:
0.13019742173165957 0.19813332522974886 0.392186707372399 0.585466685795064 0.18830230523116438
三、創建自定義Supplier的stream
Stream.generate(new MySupplier()).limit(5).forEach(System.out::println); class MySupplier implements Supplier<String> { private int i = 0; @Override public String get() { i++; return "String number " + i; } }
如上述代碼所示,我們可以自定義一個Supplier,並傳入stream.generate()函數中。在這個例子中,我們的MySupplier類實現了Supplier介面,並且使用了一個簡單的計數器,每次調用get()函數時返回一個新的字元串。運行結果如下:
String number 1 String number 2 String number 3 String number 4 String number 5
四、對stream元素進行處理
int sum = Stream.generate(() -> 1).limit(10).mapToInt(Integer::intValue).sum(); System.out.println(sum);
如上述代碼所示,我們可以對stream中的元素進行一系列處理,比如使用mapToInt()函數將stream中的元素轉換為整數類型,並使用sum()函數將所有元素求和。在這個例子中,我們創建了10個值為1的元素的stream,並對這些元素進行了求和操作。運行結果是10。
五、使用流來創建集合
List<Integer> list = Stream.generate(() -> 1).limit(5).collect(Collectors.toList()); System.out.println(list);
如上述代碼所示,我們可以使用collect()函數來將stream中的元素收集到一個集合中。在這個例子中,我們創建了5個值為1的元素的stream,並使用Collectors.toList()函數將這些元素收集到了一個List集合中。運行結果是[1, 1, 1, 1, 1]。
總之,在Java 8中,stream.generate()是一個功能強大且靈活的工具,它可以用於創建無限stream,也可以用於創建有限stream,甚至可以用於創建自定義的stream。我們可以通過一系列函數來處理這些stream中的元素,例如對它們進行過濾、映射、累加等操作。
原創文章,作者:XTZM,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/150176.html