JAVA8之Stream

流与集合

  集合是一个内存中的数据结构,集合中的每个元素都得先计算出来才能添加到集合中。

  流与集合有以下不同:

   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();
        }
    }
}
原文地址:https://www.cnblogs.com/ryjJava/p/12324457.html