zoukankan      html  css  js  c++  java
  • 浅谈java8新特性之stream

    Stream 不是数据结构,也没有内部储存结构;只是从其他数据结构抓取数据,它也绝不修改自己所封装的底层数据结构的数据。同时,stream 类似一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽了。

    1、stream的创建:

    1.1、静态工厂方法:Stream<String> stringStream = Stream.of("aa", "bb", "cc");

    1.2、Collection接口和数组的默认方法:int arr[] = new int[]{1, 2, 3};   Arrays.stream(arr) .forEach(System.out::println);

    2、stream的常见操作:

    2.1、map

    //转换大写,wordList为单词集合List<String>类型
    List<String> output = wordList.stream().map(String::toUpperCase).collect(Collectors.toList());
    
    //这段代码生成一个整数 list 的平方数 {1, 4, 9, 16}。
    List<Integer> nums = Arrays.asList(1, 2, 3, 4);
    List<Integer> squareNums = nums.stream().map(n -> n * n).collect(Collectors.toList());
    

    2.2、filter

    //留下偶数,经过条件“被 2 整除”的 filter,剩下的数字为 {2, 4, 6}。
    Integer[] sixNums = {1, 2, 3, 4, 5, 6};
    Integer[] evens =Stream.of(sixNums).filter(n -> n%2 == 0).toArray(Integer[]::new);
    //把每行的单词用 flatMap 整理到新的 Stream,然后保留长度不为 0 的,就是整篇文章中的全部单词了。
    //REGEXP为正则表达式,具体逻辑具体分析
    List<String> output = reader.lines().
        flatMap(line -> Stream.of(line.split(REGEXP))).
        filter(word -> word.length() > 0).collect(Collectors.toList());
    

    2.3、foreach

    //打印所有男性姓名,roster为person集合类型为List<Pserson>
    // Java 8
    roster.stream().filter(p -> p.getGender() == Person.Sex.MALE).forEach(p -> System.out.println(p.getName()));
    // Pre-Java 8
    for (Person p : roster) {
        if (p.getGender() == Person.Sex.MALE) {
            System.out.println(p.getName());
        }
    }
    

    2.4、Optional

    这也是一个模仿 Scala 语言中的概念,作为一个容器,它可能含有某值,或者不包含。使用它的目的是尽可能避免 NullPointerException。

    2.5、findFirst

    它总是返回 Stream 的第一个元素,或者空。

    //输出第一个元素
    List<Integer> nums = Arrays.asList(1, 2, 3, 4);
    Integer num = nums.stream().findFirst().get();
    System.out.println(num); 

    2.6、reduce

    这个方法的主要作用是把 Stream 元素组合起来。它提供一个起始值(种子),然后依照运算规则(BinaryOperator),和前面 Stream 的第一个、第二个、第 n 个元素组合。从这个意义上说,字符串拼接、数值的 sum、min、max、average 都是特殊的 reduce。也有没有起始值的情况,这时会把 Stream 的前面两个元素组合起来,返回的是 Optional。

    //求最大最小值及求和
    List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5);
    int num1=nums.stream().reduce(Integer.MIN_VALUE, Integer::max);
    int num2=nums.stream().reduce(Integer.MAX_VALUE, Integer::min);
    int num3=nums.stream().reduce(0,Integer::sum);
    System.out.println(num1+" ,"+num2+" ,"+num3);
    

    2.7、limit/skip

    limit 返回 Stream 的前面 n 个元素;skip 则是扔掉前 n 个元素

    //输出前几个的元素
    List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
    List<Integer> list = nums.stream().limit(7).collect(Collectors.toList());
    System.out.println(list);
    
    //跳过前面几个元素输出后续的
    List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
    List<Integer> list = nums.stream().skip(7).collect(Collectors.toList());
    System.out.println(list);
    

    2.8、min/max/distinct

    min 和 max 的功能也可以通过对 Stream 元素先排序,再 findFirst 来实现,但前者的性能会更好,为 O(n),而 sorted 的成本是 O(n log n)。同时它们作为特殊的 reduce 方法被独立出来也是因为求最大最小值是很常见的操作。
    2.9、Match

    Stream 有三个 match 方法,从语义上说:

    allMatch:Stream 中全部元素符合传入的 predicate,返回 true

    anyMatch:Stream 中只要有一个元素符合传入的 predicate,返回 true

    noneMatch:Stream 中没有一个元素符合传入的 predicate,返回 true

  • 相关阅读:
    22.112.leetcode_path_sum
    21.leetcode111_minimum_depth_of_binary_tree
    20.leetcode110_balanced_binary_tree
    19.leetcode108_convert_sorted_array_to_binary_search_tree
    论文阅读 | RoBERTa: A Robustly Optimized BERT Pretraining Approach
    CheckList:ACL 2020 Best Paper
    激活函数综述
    盘点深度学习中的损失函数
    逻辑回归
    机器学习之参数估计
  • 原文地址:https://www.cnblogs.com/stupid-chan/p/11227544.html
Copyright © 2011-2022 走看看