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);
posted @ 2021-02-08 14:55  xdsax  阅读(29)  评论(0编辑  收藏  举报