Java中stream是什么及如何使用

 更新时间:2023年10月27日 16:42:09   作者:SoftwareDevOps  
在Java中,Stream(流)是一种用于操作集合(Collection)、数组等数据源的API,Stream的主要作用是进行数据的转换、筛选、聚合等操作,可以极大地简化对数据的处理,本文给大家介绍Java中stream是什么?有什么作用?如何使用?感兴趣的朋友一起看看吧

Java中stream是什么?有什么作用?如何使用?

在Java中,Stream(流)是一种用于操作集合(Collection)、数组等数据源的API。它提供了一种功能强大且表达力高的编程模型,可以用更简洁、更具可读性的方式处理数据。

Stream的主要作用是进行数据的转换、筛选、聚合等操作,可以极大地简化对数据的处理。使用Stream可以避免显式地使用迭代器或循环来操作集合,提高代码的可读性和简洁性。

以下是使用Stream的一般步骤:

  • 获取一个数据源(如List、Set、数组等)。
  • 调用stream()方法获取数据流。
  • 使用各种中间操作对数据流进行处理(如筛选、转换等)。
  • 调用终端操作执行对数据流的最终处理(如聚合、收集结果等)。

下面通过示例代码详细介绍Stream的使用:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamExample {
    public static void main(String[] args) {
        // 1. 获取数据源
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        // 2. 获取数据流
        List<Integer> evenSquares = numbers.stream()
                // 3. 中间操作:筛选偶数并计算平方
                .filter(n -> n % 2 == 0)
                .map(n -> n * n)
                // 4. 终端操作:收集结果
                .collect(Collectors.toList());
        System.out.println(evenSquares); // 输出:[4, 16, 36, 64, 100]
    }
}

在上述示例中,我们首先获取了一个整数列表作为数据源。然后,通过调用stream()方法获取了一个数据流。接着,使用中间操作filter()筛选出偶数,再使用map()计算平方。最后,通过终端操作collect()将结果收集到列表中。

这只是Stream的基本用法,Stream还提供了丰富的中间操作和终端操作供使用,如sorted()distinct()reduce()等。通过组合不同的操作,可以实现复杂的数据处理逻辑。

stream用法:

filter(Predicate<T> predicate):根据指定的条件筛选元素。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = list.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());
// 输出:[2, 4]

map(Function<T, R> mapper):将元素转换为另一种类型。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<String> result = list.stream().map(n -> "Number: " + n).collect(Collectors.toList());
// 输出:["Number: 1", "Number: 2", "Number: 3", "Number: 4", "Number: 5"]

flatMap(Function<T, Stream<R>> mapper):将流中的每个元素转换为一个流,然后将所有流合并为一个流。

List<List<Integer>> lists = Arrays.asList(Arrays.asList(1, 2), Arrays.asList(3, 4, 5));
List<Integer> result = lists.stream().flatMap(list -> list.stream()).collect(Collectors.toList());
// 输出:[1, 2, 3, 4, 5]

distinct():去除流中重复的元素。

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

sorted():对流中元素进行排序。

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

peek(Consumer<T> action):对流中的元素执行指定的操作。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = list.stream().peek(n -> System.out.println("Processing element: " + n)).collect(Collectors.toList());
// 输出:Processing element: 1 Processing element: 2 Processing element: 3 Processing element: 4 Processing element: 5

limit(long maxSize):截取流中的前N个元素。

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

skip(long n):跳过流中的前N个元素。

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

1.forEach(Consumer<T> action):对流中的每个元素执行指定的操作。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.stream().forEach(n -> System.out.println(n));
// 输出:1 2 3 4 5

2.collect(Collector<T, A, R> collector):将流中的元素收集到一个容器中。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = list.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());
// 输出:[2, 4]

3.count():返回流中的元素个数。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
long count = list.stream().count();
// 输出:5

4.reduce(T identity, BinaryOperator<T> accumulator):将流中的元素逐个与初始值进行操作,返回最终结果。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int sum = list.stream().reduce(0, (a, b) -> a + b);
// 输出:15

5.findFirst()findAny():返回流中的第一个元素或任意一个元素。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> first = list.stream().findFirst();
Optional<Integer> any = list.stream().findAny();
// 输出:1

6.max()min():返回流中的最大元素或最小元素。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> max = list.stream().max(Integer::compareTo);
Optional<Integer> min = list.stream().min(Integer::compareTo);
// 输出:5 1

7.allMatch(Predicate<T> predicate)anyMatch(Predicate<T> predicate)noneMatch(Predicate<T> predicate):分别返回流中所有元素是否满足指定条件、是否至少有一个元素满足指定条件、是否没有元素满足指定条件。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
boolean allMatch = list.stream().allMatch(n -> n > 0);
boolean anyMatch = list.stream().anyMatch(n -> n % 2 == 0);
boolean noneMatch = list.stream().noneMatch(n -> n > 5);
// 输出:true true false

Stream是Java 8引入的一组 API,它提供了一种新的并行处理集合数据的方式,可以让开发者更加方便、高效地对集合进行操作。

Stream 是基于管道(Pipe)和过滤器(Filter)的模式,通过对数据源执行一系列中间操作(Intermediate Operations)和终端操作(Terminal Operations)来完成对数据的处理。

利用 Stream API,我们可以在不改变原有数据结构的前提下,方便地进行数据的筛选、排序、映射、聚合等操作,并且这些操作可以串行或并行地执行,以提高计算效率。

Stream流用途:

简化集合操作:Stream提供了丰富的中间操作和终端操作,可以更简洁地对集合进行筛选、转换、排序等操作,避免了使用传统的for循环等繁琐的操作。

并行处理:Stream API天然支持并行处理,可以自动将集合数据分成多个部分并行处理,提高处理的效率。

减少内存消耗:Stream API采用惰性求值的方式,在处理大量数据时可以只在需要时才进行计算,避免了一次性加载所有数据到内存中。

代码简洁、可读性好:Stream的链式调用和函数式编程风格使代码更加简洁、易读。每个操作都可以看作是对数据流的一次转换或处理,使得代码更加直观。

支持无限大的数据集:Stream API对于无限大的数据集也能处理,并且可以利用短路特性进行优化。

与Lambda表达式结合:Stream API广泛使用Lambda表达式,可以简化代码,提高开发效率。

到此这篇关于Java中stream是什么?有什么作用?如何使用?的文章就介绍到这了,更多相关Java中stream用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java打印指定年月份的日历

    java打印指定年月份的日历

    这篇文章主要为大家详细介绍了java打印指定年、指定月份的日历,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • SpringBoot Jackson日期格式化统一配置的实现

    SpringBoot Jackson日期格式化统一配置的实现

    Spring项目中经常需要配置日期时间格式格式,本文主要介绍了SpringBoot Jackson日期格式化统一配置的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • SpringCloud Eureka服务注册中心应用入门详解

    SpringCloud Eureka服务注册中心应用入门详解

    这篇文章主要介绍了Spring Cloud Eureka服务注册中心入门流程分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Spring的@Scope注解详细解析

    Spring的@Scope注解详细解析

    这篇文章主要介绍了Spring的@Scope注解详细解析,@Scope注解主要作用是调节Ioc容器中的作用域,springboot 程序启动时会对classpath路径下的包中的类进行扫描,将类解析成BeanDefinition,需要的朋友可以参考下
    2023-11-11
  • 让Java代码更高效

    让Java代码更高效

    这篇文章主要介绍了如何让你的Java代码更高效,让Java跑得更快,感兴趣的小伙伴们可以参考一下
    2015-09-09
  • 从零开始使用IDEA创建SpringBoot项目(图文)

    从零开始使用IDEA创建SpringBoot项目(图文)

    这篇文章主要介绍了从零开始使用IDEA创建SpringBoot项目(图文),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Java实现邮件发送QQ邮箱带附件

    Java实现邮件发送QQ邮箱带附件

    这篇文章主要为大家详细介绍了Java实现邮件发送QQ邮箱带附件功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • Java中计算集合中元素的出现次数统计

    Java中计算集合中元素的出现次数统计

    本文主要介绍了Java中计算集合中元素的出现次数统计,使用Collections类配合HashMap来统计和java lamb 计算这两种方式,具有一定的参考价值,感兴趣可以了解一下
    2024-02-02
  • Java定时任务schedule和scheduleAtFixedRate的异同

    Java定时任务schedule和scheduleAtFixedRate的异同

    本文主要介绍了Java定时任务schedule和scheduleAtFixedRate的异同,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • win10系统64位jdk1.8的下载与安装教程图解

    win10系统64位jdk1.8的下载与安装教程图解

    这篇文章主要介绍了win10系统64位jdk1.8的下载与安装教程图解,本文给大家介绍的非常详细,对大家的工作或学习具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03

最新评论