zoukankan      html  css  js  c++  java
  • Java

    参考:https://blog.csdn.net/y_k_y/article/details/84633001

    一、概述

      Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。

    二、分类

    stream操作分类
    中间操作
    无状态
    (Statusless)
    filter()    
    map()   mapToInt()   mapToLong()   mapToDouble()
    flatMap()   flatMapToInt()
    flatMapToLong()   flatMapToDouble()
    unordered()    pee()
    有状态
    (Statusful)
    distinct()   sorted()   limit()   skip()
    结束操作
    非短路操作
    foreach()      forEachOrdered()    
     toArray()       toList()   collect()     
    max()   min()    count()
    短路操作
    anyMatch()   allMatch()   noneMatch()
    findFirst()   findAny()

      解释:

         无状态:指元素的处理不受之前元素的影响;

           有状态:指该操作只有拿到所有元素之后才能继续下去。

           非短路操作:指必须处理所有元素才能得到最终结果;

           短路操作:指遇到某些符合条件的元素就可以得到最终结果,如 A || B,只要A为true,则无需判断B的结果

    三、具体用法

    1. 创建流
      • 使用Collection下的stream() 和 parallelStream() 方法
        List<String> list=new ArrayList<>();
        //  .stream()获取一个顺序流
        Stream<String> stream=list.stream();
        //  .parallelStream()获取一个并行流
        Stream<String> parallelStream=list.parallelStream();
      • 使用Array中的stream()方法
        String[] arr = {"1", "3", "2", "5", "1" };
        Stream<String> stream1=Arrays.stream(arr);
      • 使用Stream中的静态方法:of()、iterate()、generate()
        Stream<Integer> stream = Stream.of(1,2,3,4,5,6);
         
        Stream<Integer> stream2 = Stream.iterate(0, (x) -> x + 2).limit(6);
        stream2.forEach(System.out::println); // 0 2 4 6 8 10
         
        Stream<Double> stream3 = Stream.generate(Math::random).limit(2);
        stream3.forEach(System.out::println);
      • 使用 BufferedReader.lines() 方法,将每行内容转成流
        BufferedReader reader = new BufferedReader(new FileReader("F:\test_stream.txt"));
        Stream<String> lineStream = reader.lines();
        lineStream.forEach(System.out::println);
      • 使用 Pattern.splitAsStream() 方法,将字符串分隔成流
        Pattern pattern = Pattern.compile(",");
        Stream<String> stringStream = pattern.splitAsStream("a,b,c,d");
        stringStream.forEach(System.out::println);
          
    2. 流的中间操作
      • 筛选和切片
        • filter:filter的使用方式为: filter(item -> item的逻辑判断 ) ,其中filter会保留判断条件为true的记录  
        • distinct():去除重复元素
        • sorted():对流中的元素排序
        • limit(n):获取n个元素 
        • skip():跳过n个元素
                  Integer[] arr = {6, 3, 7, 3, 6,11,9, 10};
                  List<Integer> list = Arrays.asList(arr);
                  List<Integer> newlist = new ArrayList<>(list);
                  List<Integer> sList = newlist.stream()
                          .filter(ele -> ele>5)             // {6,7,6,11,9,10}
                          .distinct()                       // {6,7,11,9,10}
                          .sorted()                         // {6,7,9,10,11}
      • 映射
        • map:map方法用于映射每个元素到对应的结果
          # 输出元素对应的平方数       
                  Integer[] arr = {1,2,3,4,5};
                  List<Integer> list = Arrays.asList(arr);
                  List<Integer> newlist = new ArrayList<>(list);
                  Stream<Integer> stream= newlist.stream()
                          .map(i ->i*i);
                  stream.forEach(System.out::println);      // {1,3,9,16,25}   
  • 相关阅读:
    一个ip对应多个域名多个ssl证书配置-Nginx实现多域名证书HTTPS,NGINX支持多个带SSL证书的网站同时部署在同一台服务器上
    SVN报错:Node remains in conflict显示冲突的解决办法
    阿里云上部署了zabbix,突然无法收到报警邮件的解决办法
    npm安装socket.io时报错的解决方法(npm WARN enoent ENOENT: no such file or directory, open '/usr/local/nodejs/bin/package.json')
    winscp以命令行方式同步服务器数据到PC机磁盘上
    在阿里云上无法使用mailx发送邮件的解决办法,验证可用。
    编译geth报错的解决方法 make: *** [geth] 错误 1
    ZABBIX 3.0 监控MongoDB性能【OK】
    print命令
    软件开发规范
  • 原文地址:https://www.cnblogs.com/mysummary/p/12482295.html
Copyright © 2011-2022 走看看