流的创建方式一般有四种,分别是
由值创建流 由数组创建流 由文件创建流 由函数生成流(无限流)
接下来我们通过代码直观感受下这四种方式
@Test public void streamFromValue() { Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5); integerStream.forEach(System.out::println); }
我们通过Stream.of()方法构建了一个整型流,并进行打印(通过System.out方法引用),运行结果
@Test public void streamFromArray() { int[] numbers = {1, 2, 3, 4, 5}; IntStream stream = Arrays.stream(numbers); stream.forEach(System.out::println); }
这种方式其实和通过值类似,Arrays工具类的stream方法允许对传入的一个数组对象,并输出对应类型的流。
运行结果
@Test public void streamFromFile() throws IOException { // 返回指定路径下文件中每一行够成的字符串流 Stream<String> stream = Files.lines(Paths.get("src/main/java/com/sankuai/meituan/waimai/bizad/jdk8/stream/package-info.java")); stream.forEach(System.out::println); }
我们可以通过文件生成字符串流,通过调用Files.lines(Path path)方法,生成一个字符串流。
运行结果
...省略部分输出... * 预定义收集器功能(Collectors) * 1. 将流元素规约和汇总为一个值 * 2. 将流元素分组 * 3. 将流元素分区 * 1. 参考资料 * 区别peek与map https://blog.csdn.net/tckt75433/article/details/81510743 * */ Process finished with exit code 0
这里输出的是文件package-info.java中的内容,感兴趣的同学可以传入其他文件查看运行效果。
我们看一下Files.lines方法的声明
public static Stream<String> lines(Path path) throws IOException {
可见是通过Stream,逐行返回文件的每一行字符串
@Test public void streamFromFunction() { Stream<Double> generate = Stream.generate(Math::random); // 通过limit限制数量 generate.limit(10) .forEach(System.out::println); }
由函数生成的流为无限流,也就是如果我们没有做其他的限制(如:指定limit),对其做迭代操作,会一直运行。
这个案例中,我们通过 Math::random 生成随机数,限制生成十个并打印,运行结果
0.8969250722445276 0.8285057001330353 0.2419437635017867 0.11082352196746204 0.8035381196761233 0.5600709938550267 0.21051515736759363 0.8671614956980346 0.8063736774791785 0.8656071095608636
如果去掉limit()会怎样?感兴趣的同学可以自行尝试,相信会加深你对“无限流”的认识。
版权声明:
原创不易,洗文可耻。除非注明,本博文章均为原创,转载请以链接形式标明本文地址。