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);
    
  • 相关阅读:
    Java实现 计蒜客 拯救行动
    Java实现 计蒜客 拯救行动
    Java实现 LeetCode 174 地下城游戏
    Java实现 LeetCode 174 地下城游戏
    Java实现 LeetCode 174 地下城游戏
    Java实现 LeetCode 173 二叉搜索树迭代器
    Java实现 LeetCode 173 二叉搜索树迭代器
    Visual Studio的SDK配置
    怎样使用CMenu类
    mfc menu用法一
  • 原文地址:https://www.cnblogs.com/tiantian152/p/14499942.html
Copyright © 2011-2022 走看看