Stream构建流

由值创建流:

静态方法Stream.of,通过显式值创建一个流。它可以接受任意数量的参数。


Stream<String> stream = Stream.of("Hello", "Lambdas ","Stream");
Stream<String> emptyStream = Stream.empty();//为空的流

由数组创建流:

使用静态方法Arrays.stream从数组创建一个流。它接受一个数组作为参数。


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

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


long uniqueWords = 0;
try(Stream<String> lines =Files.lines(Paths.get("data.txt"), Charset.defaultCharset())){    ←─流会自动关闭
uniqueWords = lines.flatMap(line -> 
Arrays.stream(line.split(" ")))    ←─生成单词流 
.distinct()    ←─删除重复项
.count();    ←─数一数有多少各不相同的单词
}
catch(IOException e){ 
                     ←─如果打开文件时出现异常则加以处理
}

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

Stream API提供了两个静态方法来从函数生成流:Stream.iterate和Stream.generate。这两个操作可以创建所谓的无限流:不像从固定集合创建的流那样有固定大小的流。由iterate和generate产生的流会用给定的函数按需创建值,因此可以无穷无尽地计算下去!一般来说,应该使用limit(n)来对这种流加以限制,以避免打印无穷多个值。

迭代:iterate

在需要依次生成一系列值的时候应该使用iterate。iterate方法接受一个初始值(在这里是0),还有一个依次应用在每个产生的新值上的Lambda(UnaryOperator类型)。

Lambda n -> n + 2,返回的是前一个元素加上2。因此,iterate方法生成了一个所有正偶数的流:流的第一个元素是初始值0。然后加上2来生成新的值2,再加上2来得到新的值4,以此类推。这种iterate操作基本上是顺序的,因为结果取决于前一次应用。请注意,此操作将生成一个无限流——这个流没有结尾,因为值是按需计算的,可以永远计算下去。我们说这个流是无界的。这是流和集合之间的一个关键区别。我们使用limit方法来显式限制流的大小。这里只选择了前10个偶数。


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

生成:generate

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


Stream().generate(Math::random).limit(5);

reduce等操作要存储状态才能计算出一个值。sorted和distinct等操作也要存储状态,因为它们需要把流中的所有元素缓存起来才能返回一个新的流。这种操作称为有状态操作。流有三种基本的原始类型特化:IntStream、DoubleStream和LongStream。它们的操作也有相应的特化。流不仅可以从集合创建,也可从值、数组、文件以及iterate与generate等特定方法创建。无限流是没有固定大小的流。

版权声明:
作者:Gomo
链接:https://www.develophm.com/index.php/stream%e6%9e%84%e5%bb%ba%e6%b5%81/458/
来源:开发之家
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>