Java中stream()的使用

本文介绍了JavaStreamAPI的核心概念,包括stream()的特性、使用步骤(中间操作和终端操作),以及常见操作如filter、map和终端操作如collect、reduce的示例。强调了其惰性求值、可并行处理和性能优化的特点。
摘要由CSDN通过智能技术生成

一.stream()是什么

Stream API 提供了一种高级的抽象,使我们可以将集合转换成一种流式的处理模式,从而能大链式地执行一系列操作。

简单来说:就是把集合变成一个流,让我们能持续地在这个流上执行我们想要的操作

流的主要特点

  1. 不存储数据:流不会改变原有的数据结构,它们只提供了一种在数据源上执行操作的方法。

  2. 函数式操作:流的操作通常是函数式的,意味着你可以传递 lambda 表达式或方法引用来执行操作。

  3. 惰性求值:流的中间操作不会立即执行,只有在遇到终端操作时才会执行。这意味着中间操作会形成一种流水线,只有当结果真正需要时才开始计算,这有助于优化性能,特别是在处理大数据或复杂操作链时。

  4. 可并行:流可以很容易地并行处理,利用多核处理器来提高性能,只需要将 stream() 方法替换为 parallelStream() 方法。

二.stream的使用步骤

Stream 操作分为中间操作终端操作
其中中间操作返回的仍然是一个 Stream,允许多个操作连续进行
终端操作则会输出一个结果或产生一个副作用。

步骤:

  1. 创建 Stream

    • 从集合或数组等数据源创建 Stream
    • 使用 Stream 类的静态方法,如 Stream.of
  2. 执行中间操作

    • 中间操作如 filter, map, sorted 等,每一个操作都会返回一个新的 Stream 对象,可以继续进行其他中间操作。
  3. 执行终端操作

    • 终端操作如 forEach, collect, reduce 等,这些操作会关闭 Stream 并生成结果。

三.常见的中间操作和终端操作

中间操作

中间操作返回的是另一个 Stream,允许进一步操作。

  1. filter(Predicate<T>)
    过滤流中的元素。只包括符合给定谓词的元素。

    list.stream().filter(x -> x > 10)  // 筛选出大于10的元素
    
  2. map(Function<T, R>)
    将流中的每个元素转换成另一形式,通过给定的函数应用于每个元素。

    list.stream().map(x -> x * x)  // 将每个元素替换为其平方
    
  3. flatMap(Function<T, Stream<R>>)
    map 类似,但是每个输入元素都可以映射到多个输出元素(即一个元素列表)。

    list.stream().flatMap(x -> Stream.of(x, x + 1))  // 将每个元素转换为多个元素
    
  4. sorted()sorted(Comparator<T>)
    对流中的元素进行自然排序或使用自定义比较器排序。

    list.stream().sorted()  // 自然排序
    list.stream().sorted(Comparator.reverseOrder())  // 逆序
    
  5. distinct()
    返回一个包含独特元素的流(根据 Object.equals(Object) 方法去重)。

    list.stream().distinct()
    
  6. limit(long n)skip(long n)
    limit 截取流的前 n 个元素;skip 则是跳过前 n 个元素。

    list.stream().limit(5)  // 取前5个元素
    list.stream().skip(5)  // 跳过前5个元素
    

终端操作

终端操作会从流的管道生成结果。

  1. forEach(Consumer<T>)
    对每个元素执行给定的操作。

    list.stream().forEach(System.out::println)  // 打印每个元素
    
  2. collect(Collector<T, A, R>)
    将流转换成其他形式,是一个非常强大的操作,特别是 Collectors 类提供了很多便捷方法。

    List<Integer> newList = list.stream().collect(Collectors.toList());  // 收集到 List
    
  3. reduce(BinaryOperator<T>)
    通过重复使用给定的操作,将流中的元素组合起来,返回一个 Optional

    Optional<Integer> sum = list.stream().reduce(Integer::sum);  // 求和
    
  4. anyMatch(Predicate<T>), allMatch(Predicate<T>), noneMatch(Predicate<T>)
    检查流中的元素是否至少有一个(anyMatch)、所有元素(allMatch)、没有元素(noneMatch)匹配给定的谓词。

    boolean hasEven = list.stream().anyMatch(x -> x % 2 == 0);  // 检查是否有偶数
    
  5. count()
    返回流中的元素个数。

    long count = list.stream().count();
    
  6. min(Comparator<T>)max(Comparator<T>)
    根据给定的比较器返回流中的最小值或最大值。

    Optional<Integer> min = list.stream().min(Integer::compare);
    Optional<Integer> max = list.stream().max(Integer::compare);
    

四.示例

List<Employee> employees = getEmployees(); // 假设这是从数据库或其他地方获取的员工列表
List<Employee> filteredEmployees = employees.stream()   // 创建 Stream
    .filter(e -> e.getAge() > 30)           // 过滤年龄
    .sorted(Comparator.comparing(Employee::getName))  // 按名字排序
    .collect(Collectors.toList());          // 收集到新的列表

  • 27
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java StreamJava 8 引入的一种新的数据处理方式。Stream 不是一种数据结构,而是对数据源进行计算的工具。Stream 可以是数组、集合等,也可以是生成器函数,甚至可以是 I/O 操作。 使用 Stream 的步骤如下: 1. 创建 Stream:可以通过各种数据结构(如数组、集合、生成器函数等)创建 Stream。 2. 间操作:对 Stream 进行各种非终结操作,比如过滤、映射、排序等,得到一个新的 Stream。 3. 终结操作:对 Stream 进行终结操作,比如计数、求和、查找最大值等,得到最终的结果。 下面是一个简单的例子,展示了如何使用 Stream: ``` List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); int sum = numbers.stream() .filter(n -> n % 2 == 0) .mapToInt(n -> n) .sum(); System.out.println(sum); // 输出 30 ``` 在这个例子,我们创建了一个数字列表,然后使用 stream() 方法将其转换为 Stream。接着,我们使用 filter() 方法过滤出偶数,使用 mapToInt() 方法将其转换为 int 类型,最后使用 sum() 方法求和。 有关 Stream 的更多信息,可以参考 Oracle 官方文档:https://docs.oracle. ### 回答2: JavaStreamJava 8引入的一个新特性,用于对集合或数组进行各种操作。Stream提供了一种非常便捷的方式来处理和转换数据。 要使用Stream,首先需要创建一个Stream对象。可以通过集合类的stream()方法或数组类的stream()方法来创建一个Stream对象。例如,List集合可以调用stream()方法来获取一个Stream对象。 一旦有了Stream对象,就可以对其进行各种操作。Stream提供了许多操作方法,包括过滤、映射、排序、去重、计数等。这些操作可以串联在一起,形成一个操作链。 常见的Stream操作方法包括filter()、map()、sorted()、distinct()、collect()等。例如,filter()方法可以过滤出符合条件的元素,map()方法可以将元素进行转换,sorted()方法可以对元素进行排序,distinct()方法可以去除重复元素。 除了常见的操作方法,还可以使用一些特殊的操作方法,如reduce()、forEach()、count()等。reduce()方法可以将所有元素合并成一个结果,forEach()方法可以对每个元素进行遍历操作,count()方法可以计算元素的总数。 最后,需要注意的是,Stream的操作都是惰性求值的。这意味着在调用终止操作之前,间操作不会立即执行。只有当终止操作被调用时,所有的间操作才会按顺序执行。 总的来说,JavaStream提供了一种强大和方便的方式来处理集合和数组的操作,可以大大简化代码,并提高代码的可读性和可维护性。 ### 回答3: JavaStreamJava 8引入的一个新特性,它提供了一种高效且易于使用的方式来处理集合数据。 Stream可以用于对集合数据进行筛选、转换、聚合等各种操作。在使用Stream之前,我们首先需要将一个集合(比如List)转换成Stream对象。可以使用集合类的stream()方法或者parallelStream()方法来获取一个Stream对象。 一旦获得了Stream对象,我们就可以对其进行各种操作。常见的Stream操作方法包括filter、map、reduce、collect等。这些方法可以按照需求对Stream的数据进行过滤、映射、聚合等操作。 filter方法可以根据指定的条件对Stream的元素进行筛选。比如,我们可以使用filter方法从一个包含多个整数的Stream筛选出所有大于10的元素。 map方法可以对Stream的元素进行转换。比如,我们可以使用map方法将一个包含多个字符串的Stream的每个字符串转换为对应的大写字符串。 reduce方法可以将Stream的元素按照指定的方式进行聚合。比如,我们可以使用reduce方法计算一个包含多个整数的Stream所有元素的和。 collect方法可以将Stream的元素收集起来,生成一个新的集合。比如,我们可以使用collect方法将一个Stream的元素收集到一个ListStream还支持并行处理,可以通过parallelStream()方法将一个集合转换为并行流。在并行流,多个线程可以同时处理Stream的元素,提高处理速度。 总的来说,Stream提供了一种便捷、高效的方式来处理集合数据,可以大大简化代码,并且支持并行处理,提高处理速度。掌握Stream使用可以帮助我们更加有效地处理和操作集合数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值