当前位置: 首页 > article >正文

Java中stream流及Collectors的常见用法详细汇总!!!

目录

1. Stream流的优势

2. 常用用法

2.1 中间操作

2.1.1filter()

2.1.2 map()

2.1.3 sorted()

2.1.4 distinct() 

2.1.5 limit()

2.1.6  skip()

2.2 终端操作

2.2.1 foreach()

2.2.2 collect()

2.2.3 reduce()

2.2.4 count()

2.2.5 anyMatch()

2.3 查找和匹配

2.3.1 findFirst()

2.3.2 findAny()

2.3.3 allMatch()

2.3.4 noneMatch()

2.4 映射与连接

2.4.1 flatMap()

2.4.2 mapToInt(), maToLong(), mapToDouble()

2.5 其他方法

2.5.1 forEachOrdered()

2.5.2 min()和max()

3. Collectors

3.1 Collectors常见用法

3.1.1 将流元素收集为列表(List)

3.1.2 将流元素收集为集合(Set)

3.1.3 将流元素收集为指定集合类型

3.1.4 将流元素收集为映射(Map)

3.1.5 将流元素进行分组

3.1.6 将流元素进行分区

3.1.7 将流元素进行汇总统计

3.1.8 将流元素连接成字符串

3.1.9 将流元素收集为不可变集合

1. Stream流的优势

  1. 简洁性和可读性:通过链式调用,Stream API使代码更加简洁易懂,减少了传统循环和条件判断的使用。
  2. 并行处理:通过parallelStream(),可以轻松实现并行化数据处理,从而充分利用多核处理器的性能。
  3. 惰性求值:Stream中的中间操作只有在终端操作触发时才会执行,避免了不必要的计算。

2. 常用用法

2.1 中间操作

        中间操作会返回一个新的Stream,并且是惰性求值的(即不会立即执行,直到遇到终端操作)。这些操作通常被用于过滤、映射和排序等任务。

2.1.1filter()

        用于根据指定的条件筛选流中的元素。然会一个只包含满足条件的元素的流

语法如下:

Stream<T> filter(Predicate<? super T> predicate)

示例代码如下:

List<String> names = Arrays.asList("Java", "Stream", "API", "Code");
List<String> filteredNames = names.stream()
    .filter(name -> name.startsWith("J"))
    .collect(Collectors.toList()); // 输出: [Java]

2.1.2 map()

        将流中的每一个元素以后应用一个函数,并将结果收集到一个新的流中。常用对象属性的提取或数据转换。

语法如下:

<R> Stream<R> map(Function<? super T, ? extends R> mapper)

实例如下:

List<String> words = Arrays.asList("Java", "Stream", "API");
List<Integer> wordLengths = words.stream()
    .map(String::length)
    .collect(Collectors.toList()); // 输出: [4, 6, 3]

2.1.3 sorted()

        对流中的元素进行排序。可以不带参数(自然排序),也可以传入comparator来自定义排序规则。(定制排序,可以看一下我上一篇博客)

语法如下:

Stream<T> sorted()
Stream<T> sorted(Comparator<? super T> comparator)

示例如下:

List<Integer> numbers = Arrays.asList(5, 3, 9, 1);
List<Integer> sortedNumbers = numbers.stream()
    .sorted()
    .collect(Collectors.toList()); // 输出: [1, 3, 5, 9]

2.1.4 distinct() 

        去除流中的重复元素。通过equals()方法比较元素是否相同。

语法如下:

Stream<T> distinct()

示例如下:

List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 3, 3);
List<Integer> distinctNumbers = numbers.stream()
    .distinct()
    .collect(Collectors.toList()); // 输出: [1, 2, 3]

2.1.5 limit()

        限制流中元素的数量,返回前n个元素

如法如下:

Stream<T> limit(long maxSize)

示例如下:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> limitedNumbers = numbers.stream()
    .limit(3)
    .collect(Collectors.toList()); // 输出: [1, 2, 3]

2.1.6  skip()

        跳过流中的前n个元素,然后返回剩下的元素

语法如下:

Stream<T> skip(long n)

示例如下:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> skippedNumbers = numbers.stream()
    .skip(2)
    .collect(Collectors.toList()); // 输出: [3, 4, 5]

2.2 终端操作

        终端操作会触发Stream流的实际处理,并产生一个结果。常见的终端操作有收集数据、计算汇总值和执行遍历等。

2.2.1 foreach()

        对流中的每个元素执行指定的动作,一般用于便利流元素。

语法如下:

void forEach(Consumer<? super T> action)

示例如下:

List<String> names = Arrays.asList("Java", "Stream", "API");
names.stream().forEach(Syste

http://www.kler.cn/news/315579.html

相关文章:

  • 掌握回流与重绘面试回答:优化网页加载与响应速度
  • 前后端分离的情况下,后端接口有必要加CSP策略吗?
  • 数据集-目标检测系列-自行车检测数据集 bike>> DataBall
  • Linux系统中文件I/O
  • yolov5实战拓展
  • 使用git命令
  • 基于SpringBoot+Vue的时尚美妆电商网站系统
  • Web APIs 1:基础介绍+DOM+定时器
  • 饭局礼仪:以下这7种动作,特容易被视为没教养,不要犯
  • Vue学习记录之三(ref全家桶)
  • 今日leetCode 1. 两数之和
  • (转载)智能指针shared_ptr从C++11到C++20
  • SpringSecurity6.x整合手机短信登录授权
  • 2024 硬盘格式恢复软件大揭秘
  • 《论分布式存储系统架构设计》写作框架,软考高级系统架构设计师
  • 无限边界:现代整合安全如何保护云
  • 怀庄之醉是勾兑酒吗?
  • YOLOv10改进,YOLOv10替换主干网络为PP-HGNetV2(百度飞桨视觉团队自研,独家手把手教程,助力涨点)
  • re题(38)BUUCTF-[FlareOn6]Overlong
  • 在vue中嵌入vitepress,基于markdown文件生成静态网页从而嵌入社团周报系统的一些想法和思路
  • 【GMNER】Grounded Multimodal Named Entity Recognition on Social Media
  • 负载均衡服务由几部分组成?分别是什么
  • vue3 中后台系统中,复杂表单的开发优化技巧
  • Spring框架总体结构
  • 无人机之航线规划篇
  • Flutter 项目结构的区别
  • 十八,Spring Boot 整合 MyBatis-Plus 的详细配置
  • linux中vim编辑器的应用实例
  • 基于LSTM的温度时序预测
  • 量化交易系统开发源码独立搭建