流与集合
集合是一个内存中的数据结构,集合中的每个元素都得先计算出来才能添加到集合中。
流与集合有以下不同:
1.无存储. stream不是一种数据结构,它只是某种数据源的一个视图
2.不可修改.对stream的任何修改都不会影响背后的数据源
3.可消费性.stream只能被消费一次.
Collection:集合类接口.
Collector:收集器,也是接口,对应的工具类是Collectors.
collect:规约操作,参数为收集器.
流操作
【中间操作】对流进行处理后,会返回另一个流
操作 | 类型 | 返回类型 | 操作参数 | 函数描述符 | 描述 |
filter | 中间 | stream<T> | Predicate<T> | T -> boolean | |
map | 中间 | stream<R> | Function<T,R> | T -> R | |
limit(n) | 中间 | stream<T> | |||
sorted | 中间 | stream<T> | Comparator<T> | (T,T) -> R | |
distinct | 中间 | stream<T> | |||
skip(n) | 中间 | stream<T> | 返回一个扔掉了前n个元素的流,和limit互补 |
【终端操作】会从流的流水线生成结果
操作 | 类型 | 目的 |
forEach | 终端 | 消费流中的每个元素并对其应用Lambda |
count | 终端 | 返回流中元素的个数 |
collect | 终端 | 把流归约成一个集合 |
流的扁平化
flatMap方法可以把一个流中的每个值都换成另一个流,然后把所有的流连接起来成为一个流
flatMap参数:Function<? super T,? extends Stream<? extends R>>
构建流
1.由值创建流
Stream<String> stream = Stream.of("Java8","Lambda");
2.由数组创建流
3.由文件生成流
package stream; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Arrays; import java.util.Optional; import java.util.stream.Stream; public class FilesLinesStreamTest { public static void main(String[] args) { String fileUrl = "F:\file\123.txt"; //从path对应的文件中读取所有内容,并按行分割,返回一个 Stream<String> //try-with-resources语句可以自动调用资源的close方法 try(Stream<String> lines = Files.lines(Paths.get(fileUrl))) { Optional<String> opt = lines.flatMap(line -> Arrays.stream(line.split(" "))).findFirst(); System.out.println(opt.orElse("no data")); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }