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 }