Stream 流是 Java 8 中引入的重要概念, 把真正的函數式編程風格引入到Java中。如果能夠熟練掌握各種業務場景下對象到流的轉化,就可以方便的使用函數式風格編寫業務邏輯。
各種場景下產生 stream 方法:
1. 可以通過 Stream.of() 很容易地將一組元素轉化成為流,參數可以是一組用逗號分隔的對象,也可 以是一個集合對象,也可以是數組。
1 Stream stream1 = Stream.of("It's ", "a ", "wonderful ", "day ", "for ", "pie!"); 2 Stream stream2 = Stream.of(3.14159, 2.718, 1.618); 3 Stream stream3 = Stream.of(new ArrayList()); 4 Integer[] integers = {1,2,3}; 5 Stream stream4 = Stream.of(integers);
2. 每個集合都可以通過調用 stream() 方法來產生一個流。
1 List<Long> longList = new ArrayList(); 2 Stream stream = longList.stream();
3. Rondom 類對象可以產生隨機數流
1 Random rand = new Random(47); 2 Stream stream = rand.ints().boxed();
4. IntStream 類提供了 range() 方法用於生成整型序列的流。編寫循環時,這個方法會更加便利:
1 // import static java.util.stream.IntStream.*; 2 // 傳統方法: 3 int result = 0; 4 for (int i = 10; i < 20; i++){ 5 result += i; 6 } 7 System.out.println(result); 8 // for-in 循環: 9 result = 0; 10 for (int i : range(10, 20).toArray()){ 11 result += i; 12 }
5. 在建造者設計模式(也稱構造器模式)中,首先創建一個 builder 對象,傳遞給它多個構造器信息,最后執行“構造”。Stream 庫提供了這樣的 Builder,可以通過 builder 對象產生流。
1 // streams/FileToWordsBuilder.java 2 import java.io.*; 3 import java.nio.file.*; 4 import java.util.stream.*; 5 6 public class FileToWordsBuilder { 7 Stream.Builder<String> builder = Stream.builder(); 8 9 public FileToWordsBuilder(String filePath) throws Exception { 10 Files.lines(Paths.get(filePath)) 11 .skip(1) // 略過開頭的注釋行 12 .forEach(line -> { 13 for (String w : line.split("[ .?,]+")) 14 builder.add(w); 15 }); 16 } 17 18 Stream<String> stream() { 19 return builder.build(); 20 } 21 22 public static void main(String[] args) throws Exception { 23 new FileToWordsBuilder("Cheese.dat") 24 .stream() 25 .limit(7) 26 .map(w -> w + " ") 27 .forEach(System.out::print); 28 } 29 }
