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

news/2024/9/22 23:04:52 标签: java, 开发语言, stream流, Java工具类, 高效开发

目录

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()

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

语法如下:

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

示例代码如下:

java">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()

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

语法如下:

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

实例如下:

java">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来自定义排序规则。(定制排序,可以看一下我上一篇博客)

语法如下:

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

示例如下:

java">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()方法比较元素是否相同。

语法如下:

java">Stream<T> distinct()

示例如下:

java">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个元素

如法如下:

java">Stream<T> limit(long maxSize)

示例如下:

java">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个元素,然后返回剩下的元素

语法如下:

java">Stream<T> skip(long n)

示例如下:

java">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()

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

语法如下:

java">void forEach(Consumer<? super T> action)

示例如下:

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

http://www.niftyadmin.cn/n/5670952.html

相关文章

去耦合的一些建议

尽量少用全局变量&#xff0c;以减少状态共享和潜在的副作用。 模块化设计&#xff1a;将代码分成小模块&#xff0c;每个模块独立实现特定功能&#xff0c;减少模块之间的相互依赖。 封装&#xff1a;将数据和操作封装在类中&#xff0c;控制对内部状态的访问&#xff0c;避…

js进阶——作用域闭包

1. 作用域与闭包的基础概念 1.1 作用域 (Scope) 在 JavaScript 中&#xff0c;作用域定义了变量、函数的可访问性。根据变量声明的位置不同&#xff0c;作用域有三种主要类型&#xff1a; 全局作用域&#xff1a;在代码的任何地方都可以访问。函数作用域&#xff1a;只在声明…

Linux(6)--CentOS目录

文章目录 1. 根目录2. cd目录切换命令3. CentOS目录介绍4. pwd命令介绍5. ls命令介绍5.1 ls5.2 ls -a5.3 ls -l 1. 根目录 Windows电脑的根目录是计算机(我的电脑)&#xff0c;然后C盘、D盘。 Linux系统的根目录是/&#xff0c;我们可以使用cd /进入根目录&#xff0c;然后使…

OpenCV特征检测(10)检测图像中直线的函数HoughLinesP()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在二值图像中使用概率霍夫变换查找线段。 该函数实现了用于直线检测的概率霍夫变换算法&#xff0c;该算法在文献 181中有所描述。 HoughLines…

javase笔记4----常用类型

常用类型 包装类 简介 java语言是面向对象的语言&#xff0c;但是其中的八大基本数据类型不符合面向对象的特征。 因此java为了弥补这样的缺点&#xff0c;为这八种基本数据类型专门设计了八种符合面向对象特征的的类型&#xff0c;这八种具有面向对象特征的类型&#xff0c;…

【工具】Windows|两款开源桌面窗口管理小工具Deskpins和WindowTop

总结 Deskpins 功能单一&#xff0c;拖到窗口上窗口就可以置顶并且标记钉子标签&#xff0c;大小 104 KB&#xff0c;开源位置&#xff1a;https://github.com/thewhitegrizzli/DeskPins/releases WindowTop 功能完善全面强大&#xff0c;包括透明度、置顶、选区置顶等一系列功…

《ImageNet Classification with Deep Convolutional Neural Networks》总结

摘要 训练了一个深层的卷积神经网络&#xff0c;在图像分类的竞赛上以碾压性的优势击败了第二名。有5个卷积层&#xff0c;一些池化层&#xff0c;3个全连接层。用了dropout防止过拟合 1、引言 在几十年前&#xff0c;神经网络不被计算机视觉接受&#xff0c;他们认为这种黑…

javascript的闭包学习

为什么要产生闭包的概念&#xff0c;通俗来说一下。 公司有一个项目&#xff0c;分为两个部分&#xff0c;张三、李四各分配一个部分。 张三.js代码&#xff1a; var key我要吃肉 function fn(){console.log(key); } 李四.js代码&#xff1a; var key我要喝酒 function fn…