Java Stream:构建流

旧城等待, 2022-01-25 20:15 329阅读 0赞

创建流的方法有很多,本文将介绍如何从值序列、数组、文件来创建流,甚至由生成函数来创建流。

1.由值来创建流

可以使用静态方法Stream.of,通过显式值来创建流。它可以接受任意数量的参数。例如,以下代码直接使用Stream.of创建了一个字符串流。然后可以将字符串转换为大写,再一个个打印出来:

  1. Stream<String> stream = Stream.of("Java 8 ", "Lambdas ", "In ", "Action");
  2. stream.map(String::toUpperCase).forEach(System.out::println);

可以使用empty得到一个空流,

  1. Stream<String> emptyStream = Stream.empty();

2.由数组创建流

可以使用Arrays.stream从数组创建一个流。它接受一个数组作为参数。例如,可以将一个原始类型int的数组转换成一个IntStream,

例如:

  1. int[] numbers = {2, 3, 5, 7, 11, 13};
  2. int sum = Arrays.stream(numbers).sum();

3.由文件生成流

Java中用于处理文件等i/o操作的NIO API(非阻塞I/O)已更新,已便利用Stream API。java.nio.file.Files中的很多静态方法都会返回一个流。例如,一个很有用的方法是Files.lines,它会返回一个由指定文件中的各行构成的字符流。可以用这个方法看看一个文件中由多少各不相同的词:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI1OTMzMjQ5_size_16_color_FFFFFF_t_70

你可以使用Files.lines得到一个流,其中的每一个元素都是给定文件中的一行。然后使用Lambda表达式拆分成单词。注意flatMap产生一个扁平的单词流,而不是给每一行生成一个单词流。最后调用distinct()和count()方法链接起来。

4.由函数生成流:创建无限流

Stream API 提供了两个静态方法来从函数生成流:Stream.iterate和Stream.generate。这两个操作可以创建所谓的无限流:不像从固定集合创建的流那样由固定大小的流。由iterate和generate产生的流会用给定的函数按需创建值。因此可以无穷的计算下去。
(1)迭代

  1. Stream.iterate(0, n -> n + 2)
  2. .limit(10)
  3. .forEach(System.out::println);

iterate方法接受一个初始值(在这里是0),还有一个Lambda表达式(UnaryOperator类型)。此操作如果没有limit()方法进行截断,将不断的打印偶数,是一个无限流。

(2)生成

与iterate方法类似,generate方法也可以按需生成无限流,但generate不是依次对每一个新生成的值应用函数的。它接受一个Supplier类型的Lambda提供的新值。

  1. Stream.generate(Math::random)
  2. .limit(5)
  3. .forEach(System.out::println);

输出:

  1. 0.9410810294106129
  2. 0.6586270755634592
  3. 0.9592859117266873
  4. 0.13743396659487006
  5. 0.3942776037651241

发表评论

表情:
评论列表 (有 0 条评论,329人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java--Stream

    Stream流可以理解为工厂的流水线,一步一步地对数据进行过滤操作。Stream流在使用过程中会结合Lambda表达式,简化集合、数组操作。 一、Stream流的使用步骤:

    相关 Java Stream

    Java 8 版本新增的Stream,配合同版本出现的Lambda ,给我们操作集合(Collection)提供了极大的便利。Stream流是JDK8新增的成员,允许以声明性方

    相关 Java Stream:构建

    创建流的方法有很多,本文将介绍如何从值序列、数组、文件来创建流,甚至由生成函数来创建流。 1.由值来创建流 可以使用静态方法Stream.of,通过显式值来创建流。它可以接