转载

Java8函数式编程之Stream编程详解(3)Stream的创建方式

流的创建方式一般有四种,分别是

由值创建流

由数组创建流

由文件创建流

由函数生成流(无限流)

接下来我们通过代码直观感受下这四种方式

4.6.1.由值创建流

@Test
public void streamFromValue() {
    Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5);
    integerStream.forEach(System.out::println);
}

我们通过Stream.of()方法构建了一个整型流,并进行打印(通过System.out方法引用),运行结果

4.6.2.由数组创建流

@Test
public void streamFromArray() {
    int[] numbers = {1, 2, 3, 4, 5};
    IntStream stream = Arrays.stream(numbers);
    stream.forEach(System.out::println);
}

这种方式其实和通过值类似,Arrays工具类的stream方法允许对传入的一个数组对象,并输出对应类型的流。

运行结果

4.6.3.由文件创建流

@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,逐行返回文件的每一行字符串

4.6.4.由函数生成流(无限流)

@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()会怎样?感兴趣的同学可以自行尝试,相信会加深你对“无限流”的认识。

版权声明:

原创不易,洗文可耻。除非注明,本博文章均为原创,转载请以链接形式标明本文地址。

原文  http://wuwenliang.net/2020/05/17/Java8函数式编程之Stream编程详解-3-Stream的创建方式/
正文到此结束
Loading...