java8的stream流操作讲解

日期:2018-09-17       浏览:687

一 图解

stream流操作示意图
stream流操作示意图
流操作一般可以归类三个步骤:
  1. 实现 Collection 接口的集合调用stream()方法获取 Stream 对象;
  2. 通过 Stream 对象的中间操作(filter、map、sorted、distinct等)对数据流进行处理;
  3. 通过 Stream 对象的终端操作(count、collect、findFirst等)对中间操作的处理结果进行归一;
中间操作可以有多步,但是终端操作只能有一个;

二 Stream 方法讲解

2.1 中间操作方法

方法名 描述
filter() 过滤操作
distinct() 取除重复元素
sorted() 排序
peek() 对元素进行处理
limit() 获取前n个元素
skip() 跳过前n个元素
reduce() 规约计算

2.2 终端操作方法

方法名 描述
forEach() 循环
forEachOrdered() 并行处理时,按顺序循环
toArray() 结果转数组
min() 最小值
max() 最大值
count() 统计
anyMatch() 是否存在匹配
allMatch() 是否全部匹配
noneMatch() 是否全部不匹配
findFirst() 获取第一个元素
findAny() 随机获取一个元素
collect() 收集

2.3 收集器Collectors工具方法

方法名 描述
groupingBy() 分组
toList() 转 List
toSet() 转 Set
toMap() 转 Map
maxBy() 获取最大值
minBy() 获取最小值
summingInt() 求和(结果为 int 类型)
averagingInt() 求平均值(结果转 int 类型)
summarizingInt() 统计个数、求和、平均值、最大值、最小值
joining() toString 后拼接为一个字符串
reducing() 归约计算
counting() 统计

三 使用案例

3.1 案例背景

我们就以最常见的文章和类别为例,展开来讲解一下具体的使用场景;
文章实体类
@Data
public class Article {
    private String id;
    // 类别ID
    private String categoryId;
    private String name;
    private String content;
    // 浏览次数
    private long views;
    // 是否发布,0:未发布、1:已发布
    private int publish;
    private Date created;
    private Date updated;
}
数据集
// 全部文章
List<Article> articles = new ArrayList<>();

3.2 filter、sorted

查询所有已发布的文章,按创建时间排序
List<Article> publishedArticles = articles.stream()
                .filter(article -> article.getPublish() == 1)
                .sorted(Comparator.comparing(Article::getCreated).reversed())
                .collect(Collectors.toList());

3.3 sorted、limit

按创建时间排序查询最新的前三篇文章;
List<Article> newArticles = articles.stream()
                .sorted(Comparator.comparing(Article::getCreated).reversed())
                .limit(3)
                .collect(Collectors.toList());

3.4 groupingBy

将文章按类别ID归类
Map<String, List<Article>> articlesMap = articles.stream()
                .collect(Collectors.groupingBy(Article::getCategoryId));

3.5 filter、mapToLong、reduce

统计所有已发布文章的浏览量
long totalViews = articles.stream()
                .filter(article -> article.getPublish() == 1)
                .mapToLong(Article::getViews)
                .reduce(0, (x, y) -> x + y);
扫码关注有惊喜

(转载本站文章请注明作者和出处 qbian)

暂无评论

Copyright 2016 qbian. All Rights Reserved.

文章目录