Java Steam详解

本文详细介绍了Java 8中的Stream API,包括Stream的基本概念、创建方法、中间操作(筛选、映射、排序、消费)以及终止操作(匹配和聚合)。讲解了filter、map、sorted、peek等关键操作,并阐述了Stream的惰性求值和一次性消费等特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Steam概述

Stream是 Java 8新增加的类,用来补充集合类。
Stream代表数据流,流中的数据元素的数量可能是有限的,也可能是无限的。
Java Stream提供了提供了串行和并行两种类型的流,保持一致的接口,提供函数式编程方式,以管道方式提供中间操作和最终执行操作,为Java语言的集合提供了现代语言提供的类似的高阶函数操作,简化和提高了Java集合的功能

介绍

  1. 不存储数据:流是基于数据源的对象,它本身不存储数据元素,而是通过管道将数据源的元素传递给操作。
  2. 函数式编程:流的操作不会修改数据源,例如filter不会将数据源中的数据删除
  3. 延迟操作: 惰性求值,流在中间处理过程中,只是对操作进行了记录,并不会立即执行,需要等到执行终止操作的时候才会进行实际的计算。
  4. 可以解绑:对于无限数量的流,有些操作是可以在有限的时间完成的,比如limit(n) 或 findFirst(),这些操作可是实现"短路"(Short-circuiting),访问到有限的元素后就可以返回。
  5. 纯消费:流的元素只能访问一次,类似iterator,操作没有回头路,如果你想从头访问一遍流的元素,那必须重新生成一个流。
    流的操作是以管道方式串起来的,流管道包含一个数据源,接着包含0-n个中间操作,最后包含一个终点操作结束。

流的常用创建方法

1.1 使用Collection下的 stream() 和 parallelStream() 方法

List<String> list = new ArrayList<>();
Stream<String> stream = list.stream(); //获取一个顺序流
Stream<String> parallelStream = list.parallelStream(); //获取一个并行流

1.2 使用Arrays 中的 stream() 方法,将数组转成流

Integer[] nums = new Integer[10];
Stream<Integer> stream = Arrays.stream(nums);

1.3 使用Stream中的静态方法:of()、iterate()、generate()

Stream<Integer> stream = Stream.of(1,2,3,4,5,6);
 
Stream<Integer> stream2 = Stream.iterate(0, (x) -> x + 2).limit(
### Java Stream `orElse` 方法详解Java Stream API中,`Optional<T>` 类提供了多种处理可能为空值的方法,其中就包括 `orElse(T other)`。此方法用于当 Optional 实例存在值时返回该值;如果不存在,则返回指定的默认值。 #### 使用场景 当流操作最终收集到的结果可能是空的情况下,可以利用 `orElse` 提供一个合理的替代选项来避免潜在的 NullPointerException 或者其他逻辑错误[^1]。 #### 基本语法 ```java T result = stream().findFirst().orElse(defaultValue); ``` 这里 `stream()` 表达的是任意形式的数据源转换成的流对象调用链路,而 `defaultValue` 则是在找不到匹配项时所使用的备选方案。 #### 示例代码 下面是一个简单的例子展示如何使用 `orElse`: ```java import java.util.Arrays; import java.util.List; public class OrElseExample { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3); int firstNumber = numbers.stream() .filter(n -> n > 0) .findFirst() .orElse(-1); // 如果没有找到符合条件的元素则返回-1 System.out.println("First number greater than zero is " + firstNumber); // 当没有任何元素满足条件时的情况 boolean hasNegativeNumbers = false; int negativeResult = numbers.stream() .filter(n -> n < 0 && (hasNegativeNumbers = true)) .findFirst() .orElseThrow(() -> new IllegalStateException("No negative numbers found")); if (!hasNegativeNumbers){ System.out.println("There are no elements less than zero."); } else{ System.out.println("The first negative number encountered was: "+negativeResult); } } } ``` 在这个例子中,程序尝试获取列表中的第一个正数并打印出来。如果没有发现任何大于零的整数,默认情况下将会输出 `-1`。对于负数部分,由于过滤器不会触发(因为给定列表里只有正值),所以会抛出自定义异常表示未找到小于零的数值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值