zoukankan      html  css  js  c++  java
  • Stream流

    一、什么是Stream流

    Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。

    Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。

    Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。

    这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

    元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

    public class Demo02Stream {
        public static void main(String[] args) {
            //创建一个List集合,存储姓名
            List<String> list = new ArrayList<>();
            list.add("张无忌");
            list.add("周芷若");
            list.add("赵敏");
            list.add("张强");
            list.add("张三丰");
    
            //对list集合中的元素进行过滤,只要以张开头的元素,存储到一个新的集合中
            //对listA集合进行过滤,只要姓名长度为3的人,存储到一个新集合中
            //遍历listB集合
            list.stream()
                    .filter(name->name.startsWith("张"))
                    .filter(name->name.length()==3)
                    .forEach(System.out::println);
    	}
    }
    

    Stream(流)是一个来自数据源的元素队列并支持聚合操作

    • 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
    • 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
    • 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。

    和以前的Collection操作不同, Stream操作还有两个基础的特征:

    • Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。
    • 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。

    二、Stream流操作

    1)stream 生成流

    //把集合转换为Stream流
    List<String> list = new ArrayList<>();
    Stream<String> stream1 = list.stream();
    
    Set<String> set = new HashSet<>();
    Stream<String> stream2 = set.stream();
    
    Map<String,String> map = new HashMap<>();
    //获取键,存储到一个Set集合中
    Set<String> keySet = map.keySet();
    Stream<String> stream3 = keySet.stream();
    
    //获取值,存储到一个Collection集合中
    Collection<String> values = map.values();
    Stream<String> stream4 = values.stream();
    
    //获取键值对(键与值的映射关系 entrySet)
    Set<Map.Entry<String, String>> entries = map.entrySet();
    Stream<Map.Entry<String, String>> stream5 = entries.stream();
    
    //把数组转换为Stream流
    Stream<Integer> stream6 = Stream.of(1, 2, 3, 4, 5);
    //可变参数可以传递数组
    Integer[] arr = {1,2,3,4,5};
    Stream<Integer> stream7 = Stream.of(arr);
    

    2)forEach 遍历

    // 获取一个Stream流
    Stream<String> stream = Stream.of("张三", "李四", "王五", "赵六", "田七");
    // 使用Stream流中的方法forEach对Stream流中的数据进行遍历
    stream.forEach((String name)->{
    	System.out.println(name);
    });
    
    // 简化
    stream.forEach(System.out::println);
    

    3)filter 过滤

    //创建一个List集合,存储姓名
    List<String> list = new ArrayList<>();
    list.add("张无忌");
    list.add("周芷若");
    list.add("赵敏");
    list.add("张强");
    list.add("张三丰");
    
    //对list集合中的元素进行过滤,只要以张开头的元素,存储到一个新的集合中
    //对listA集合进行过滤,只要姓名长度为3的人,存储到一个新集合中
    //遍历listB集合
    list.stream()
        .filter(name->name.startsWith("张"))
        .filter(name->name.length()==3)
        .forEach(System.out::println);
    

    4)map 映射

    //获取一个String类型的Stream流
    Stream<String> stream = Stream.of("1", "2", "3", "4");
    //使用map方法,把字符串类型的整数,转换(映射)为Integer类型的整数
    Stream<Integer> stream2 = stream.map((String s)->Integer.parseInt(s));
    

    5)count 统计流中的元素个数

    //获取一个Stream流
    ArrayList<Integer> list = new ArrayList<>();
    list.add(1);
    list.add(2);
    list.add(3);
    Stream<Integer> stream = list.stream();
    long count = stream.count();
    System.out.println(count);//3
    

    6)limit 截取流中的元素

    //获取一个Stream流
    String[] arr = {"美羊羊","喜洋洋","懒洋洋","灰太狼","红太狼"};
    Stream<String> stream = Stream.of(arr);
    //使用limit对Stream流中的元素进行截取,只要前3个元素
    Stream<String> stream2 = stream.limit(3);
    //遍历stream2流
    stream2.forEach(System.out::println);
    
    /*美羊羊
      喜洋洋
      懒洋洋*/
    

    7)skip 用于跳过元素

    //获取一个Stream流
    String[] arr = {"美羊羊","喜洋洋","懒洋洋","灰太狼","红太狼"};
    Stream<String> stream = Stream.of(arr);
    //使用skip方法跳过前3个元素
    Stream<String> stream2 = stream.skip(3);
    //遍历stream2流
    stream2.forEach(System.out::println);
    
    /*灰太狼
      红太狼*/
    

    8)concat 把流组合到一起

    //创建一个Stream流
    Stream<String> stream1 = Stream.of("张三丰", "张翠山", "赵敏", "周芷若", "张无忌");
    //获取一个Stream流
    String[] arr = {"美羊羊","喜洋洋","懒洋洋","灰太狼","红太狼"};
    Stream<String> stream2 = Stream.of(arr);
    //把以上两个流组合为一个流
    Stream<String> concat = Stream.concat(stream1, stream2);
    //遍历concat流
    concat.forEach(System.out::println);
    
    /*张三丰
      张翠山
      赵敏
      周芷若
      张无忌
      美羊羊
      喜洋洋
      懒洋洋
      灰太狼
      红太狼*/
    

    9)sorted 排序

    以下代码片段使用 sorted 方法对输出的 10 个随机数进行排序:

    Random random = new Random();
    random.ints()
        .limit(10)
        .sorted()
        .forEach(System.out::println);
    
  • 相关阅读:
    IOS RunLoop理解(参考YYKit)
    与个推人员的沟通
    idea报错:找不到或无法加载主类
    linux couldnt resolve host mirrors.aliyun.com解决方法
    【Linux】简单明了查看内存使用和ubuntu的版本号及位数
    【Linux】scp“免密” 远程copy较多文件
    【Repo】推送一个已有的代码到新的 gerrit 服务器
    Android之Monkey全参数(包含隐藏参数)
    Android系统adb命令查看CPU与内存使用率
    adb 命令连接指定设备
  • 原文地址:https://www.cnblogs.com/tiantian152/p/14499942.html
Copyright © 2011-2022 走看看