前言

在 java 中,涉及到对数组、集合等集合类元素的操作时,通常我们使用的是循环的方式进行逐个遍历处理,或者使用 stream 流的方式进行处理。

什么是 Stream?

Stream(流)是一个来自数据源的元素队列并支持聚合操作,流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。 Stream(流)的组成包含:元素、数据源、聚合操作、内部迭代、Pipelining等。

创建 Stream 流

1)stream()
 
 
 
 
Stream<String> stream = stringList.stream();

2)parallelStream()

Stream<String> stringStream = stringList.parallelStream();

Stream 流常用操作

1)forEach

stringList.forEach(System.out::println);

2)map

stringList.stream().map(i->i.equals("juejin"));

3)filter

stringList.stream().filter(i->i.equals("juejin"));

4)limit

integerList.stream().limit(3);

5)skip

integerList.stream().skip(5).limit(3);

6)distinct

integerList.stream().distinct().collect(Collectors.toList());

7)sorted

integerList.stream().sorted();

8)sorted(Comparator com)

integerList.stream().sorted(Comparator.comparing(Integer::intValue));

9)Collectors 收集器

  • 恒等处理 Collectors

所谓恒等处理,指的就是Stream的元素在经过Collector函数处理前后完全不变,例如toList()操作,只是最终将结果从Stream中取出放入到List对象中,并没有对元素本身做任何的更改处理

list.stream().collect(Collectors.toList());
list.stream().collect(Collectors.toSet());
list.stream().collect(Collectors.toCollection());
  • 归约汇总 Collectors

对于归约汇总类的操作,Stream流中的元素逐个遍历,进入到Collector处理函数中,然后会与上一个元素的处理结果进行合并处理,并得到一个新的结果,以此类推,直到遍历完成后,输出最终的结果

counting
 
统计流中的元素个数
 
summingInt
 
计算流中指定int字段的累加总和。针对不同类型的数字类型,有不同的方法,比如summingDouble等
 
averagingInt
 
计算流中指定int字段的平均值。针对不同类型的数字类型,有不同的方法,比如averagingLong等
 
joining
 
将流中所有元素(或者元素的指定字段)字符串值进行拼接,可以指定拼接连接符,或者首尾拼接字符
 
maxBy
 
根据给定的比较器,选择出值最大的元素
 
minBy
 
根据给定的比较器,选择出值最小的元素

  • 分组分区 Collectors
    仅仅是做一个常规的数据分组操作时,可以仅传入一个分组函数即可
public void groupBySubCompany() {
// 按照子公司维度将员工分组
Map<String, List<Employee>> resultMap =
getAllEmployees().stream()
.collect(Collectors.groupingBy(Employee::getSubCompany));
System.out.println(resultMap);
}

    如果不仅需要分组,还需要对分组后的数据进行处理的时候,则需要同时给定分组函数以及值收集器

public void groupAndCaculate() {
// 按照子公司分组,并统计每个子公司的员工数
Map<String, Long> resultMap = getAllEmployees().stream()
.collect(Collectors.groupingBy(Employee::getSubCompany,
Collectors.counting()));
System.out.println(resultMap);
}

总结

简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。让程序员写出高效率、干净、简洁的代码。

Java 8 新特性:Stream 流快速入门的更多相关文章

  1. 再来看看Java的新特性——Stream流

    半年前开始试着使用Java的新特性,给我印象最深的就是Stream流和Optional.其中Stream提高了看法效率,让代码看起来十分清爽. 为什么要使用流? 摘要中已经说明了,为了提高开发效率.流 ...

  2. Java 8 新特性-Stream更优雅的处理集合入门

    Java 8 新特性之--Stream 一. 简单介绍 Stream是Java 8提出了的一种新的对集合对象功能的增强.它集合Lambda表达式,对集合提供了一些非常便利,高效的操作,使得代码具有非常 ...

  3. 这可能是史上最好的 Java8 新特性 Stream 流教程

    本文翻译自 https://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/ 作者: @Winterbe 欢迎关注个人微信公众 ...

  4. Java8新特性 Stream流式思想(一)

    遍历及过滤集合中的元素使用传统方式遍历及过滤集合中的元素package cn.com.zq.demo01.Stream.test01.Stream; import java.util.ArrayLis ...

  5. Java1.8新特性 - Stream流式算法

    一. 流式处理简介   在我接触到java8流式数据处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助于流式处理可以在一行中实现.比如我们希望对一个包 ...

  6. Java8新特性 Stream流式思想(二)

    如何获取Stream流刚开始写博客,有一些不到位的地方,还请各位论坛大佬见谅,谢谢! package cn.com.zq.demo01.Stream.test01.Stream; import org ...

  7. java8 新特性Stream流的应用

    作为一个合格的程序员,如何让代码更简洁明了,提升编码速度尼. 今天跟着我一起来学习下java 8  stream 流的应用吧. 废话不多说,直入正题. 考虑以下业务场景,有四个人员信息,我们需要根据性 ...

  8. Java8新特性 Stream流式思想(三)

    Stream接口中的常用方法 forEach()方法package cn.com.cqucc.demo02.StreamMethods.Test02.StreamMethods; import jav ...

  9. JDK8新特性---stream流

    项目上用到了stream流,找篇blog,转载一下,介绍下Stream流的用法. 1 流概述  流是 JDK8 新增的成员,允许以声明性方式处理数据集合,可以把 Stream 流看作是遍历数据集合的一 ...

  10. Java8新特性Stream流应用示例

    Java8新特性介绍 过滤集合 List<String> newList = list.stream().filter(item -> item != null).collect(C ...

随机推荐

  1. 题解:P10677 『STA - R6』inkar-usi

    背景 把人家鸽了,感觉废了. 分析 这道题刚看到题目的时候很多人会想爆搜,但是因为 \(10^3\) 的数据范围,所以应该去想一想是不是有什么性质. 我们稍微想一想就会发现,题目上提到了可以重复走,那 ...

  2. AT_abc180_d 题解

    洛谷链接&Atcoder 链接 本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读. 题目简述 现有 \(STR\) 和 \(EXP\) 两个变量,初始化分别为 \(X\) 和 \( ...

  3. vscode取消json文件注释下划线

    使用 vscode 打开一个json文件,如果有单行或多行注释,则会显示红色下划线,解决办法如下: 方法1 点击底部的JSON,选择 JSON with Comments 即可,然后红色下划线消失,底 ...

  4. C# Win10缩放导致Winform字体模糊的解决方法

    问题描述 现在的笔记本电脑分辨率很高,基本上能达到1920*1080以上,因为笔记本的屏幕小,在这样的分辨率下一切看着都很小,尤其是文字,根本看不清,所以Win10很人性化的提供了屏幕缩放功能,一般默 ...

  5. 假期小结7爬虫学习requests

    这周我初步学习了py爬虫的相关知识,以下是我的部分总结 URL headers(URL头部)是HTTP请求中包含的一部分信息,用于描述.控制和传递请求的各种元数据.它们是位于HTTP请求消息的起始部分 ...

  6. docker 容器挂载技术

    创建和使用桥接网络 docker network create --driver bridge --subnet 192.168.13.0/24 --gateway 192.168.13.1 mqyn ...

  7. 【Centos】RPM安装Mysql8

    先去官网下载RPM包,没想到RPM包是红帽发行版 https://dev.mysql.com/downloads/mysql/ 使用wget直接下载到Centos里面: wget https://cd ...

  8. gym.wrappers.Monitor报错,无法使用

    使用gym中的录制功能,报错,具体: >>> import gym >>> gym.wrappers.MonitorTraceback (most recent c ...

  9. python多进程multiprocessing模块的变量传递问题:父进程中的numpy.array对象隐式序列化到子进程后的inplace操作的问题

    参考: https://docs.python.org/zh-cn/3/library/multiprocessing.html cloudpickle -- Python分布式序列化的专用模块   ...

  10. 给我5分钟,保证教会你在vue3中动态加载远程组件

    前言 在一些特殊的场景中(比如低代码.减少小程序包体积.类似于APP的热更新),我们需要从服务端动态加载.vue文件,然后将动态加载的远程vue组件渲染到我们的项目中.今天这篇文章我将带你学会,在vu ...