zoukankan      html  css  js  c++  java
  • JDK8_Stream

    什么是Stream?

    stream的三大特性:1、不存储数据2、不改变源数据3、延时执行。

    stream优点:1、简化代码2、使用并行流可以利用多核特性,提升效率。

    stream上的所有操作分为两类:中间操作和结束操作,中间操作只是一种标记,只有结束操作才会触发实际计算。

    常用API

    img

    API详解

    中间操作

      filter:过滤流,过滤流中的元素,返回一个符合条件的Stream

      map:转换流,将一种类型的流转换为另外一种流。(mapToInt、mapToLong、mapToDouble 返回int、long、double基本类型对应的Stream)

      flatMap:简单的说,就是一个或多个流合并成一个新流。(flatMapToInt、flatMapToLong、flatMapToDouble 返回对应的IntStream、LongStream、DoubleStream流。)

      distinct:返回去重的Stream。

      sorted:返回一个排序的Stream。

      peek:主要用来查看流中元素的数据状态。

      limit:返回前n个元素数据组成的Stream。属于短路操作

      skip:返回第n个元素后面数据组成的Stream。

    结束操作

      forEach: 循环操作Stream中数据。

      toArray: 返回流中元素对应的数组对象。

      reduce: 聚合操作,用来做统计。

      collect: 聚合操作,封装目标数据。

      min、max、count: 聚合操作,最小值,最大值,总数量。

      anyMatch: 短路操作,有一个符合条件返回true。

      allMatch: 所有数据都符合条件返回true。

      noneMatch: 所有数据都不符合条件返回true。

      findFirst: 短路操作,获取第一个元素。

      findAny: 短路操作,获取任一元素。

      forEachOrdered: 暗元素顺序执行循环操作。

    基于Stream对集合操作封装的工具方法

    映射

    public static <T,R> List<R> map(List<T> data, Function<T,R> fun){
        if (CollectionUtils.isEmpty(data)){
            throw new IllegalArgumentException();
        }
        return data.stream().map(fun).collect(Collectors.toList());
    }
    

    过滤

    public static <T> List<T> filter(List<T> data, Predicate<T> pre){
        if (CollectionUtils.isEmpty(data)){
            return data;
        }
        return data.stream().filter(pre).collect(Collectors.toList());
    }
    

    排序

    public static <T> List<T> sorted(List<T> data, Comparator<T> comparator){
        if (CollectionUtils.isEmpty(data)){
            return data;
        }
        return data.stream().sorted(comparator).collect(Collectors.toList());
    }
    

    去重

    public static <T> List<T> distinct(List<T> data){
        if (CollectionUtils.isEmpty(data)){
            return data;
        }
        return data.stream().distinct().collect(Collectors.toList());
    }
    

    判断是否包含某个元素

    public static <T> boolean anyMatch(List<T> data, Predicate<T> pre){
        if (CollectionUtils.isEmpty(data)){
            return false;
        }
        return data.parallelStream().anyMatch(pre);
    }
    

    JOIN操作

    public static String join(List<String> data,String join){
        if (CollectionUtils.isEmpty(data)){
            return null;
        }
        return data.stream().collect(Collectors.joining(join == null ? "" : join));
    }
    
    • 五种求和方式

    Long firstSum = personlist.stream()
       	.collect(Collectors.summarizingLong(Person::getId)).getSum();
    Long secondSum = personlist.stream()
        .collect(Collectors.summingLong(Person::getId));
    int thirdSum = personlist.stream()
        .mapToInt(Person::getId).sum();
    Integer forthSum = personlist.stream()
        .collect(Collectors.reducing(0,Person::getId,(i,j)->i+j));
    
    IntSummaryStatistics stats = personlist.stream().mapToInt(Person::getId).summaryStatistics();
    Long fiveSum = stats.getSum();
    System.out.println(firstSum + ":" + secondSum + ":" + thirdSum + ":" + forthSum + ":" + fiveSum);
    
  • 相关阅读:
    SW 查看 外部引用
    零散/未完成 SW 视图 坐标
    美团 大众 摩拜 猫眼 统一 账号
    lua file system lfs 软链接 硬链接
    SketchUp VS对比 SolidWorks
    安卓 自动化
    Windows 获取文件的实际路径、名字(大小写敏感)
    bat启动java程序
    java判断某个字符串是否是数字
    commonslogging和log4j配合使用
  • 原文地址:https://www.cnblogs.com/linqing001/p/14388854.html
Copyright © 2011-2022 走看看