初步了解Stream流

本文介绍了Java8中StreamAPI的概念,包括Stream的工作原理、创建方式,以及常用的中间操作(如filter、map、sorted等)、终端操作(如forEach、collect、reduce等)。通过实例展示了如何高效地处理集合数据并生成结果。
摘要由CSDN通过智能技术生成

一、了解Stream

在 Java 中,“Stream” 是一个比较常见的概念,它引入了函数式编程的思想,提供了一种便捷而高效的处理集合数据的方式。Java 8 引入了 Stream API,它允许开发者通过一系列的操作(如过滤、映射、排序等)来处理集合数据,而无需显式地编写循环语句。并且这个过程通常不会对数据源造成影响。

同时Stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等。在Stream中的操作每一次都会产生新的流,内部不会像普通集合操作一样立刻获取值,而是惰性取值,只有等到用户真正需要结果的时候才会执行。

二、Stream API的使用

1.创建Stream流

//从集合中创建、例如List、Map、Set等
List<String> list = new ArrayList<String>();
Stream stream = list.stream();

//从数组中创建
int[] nums = {1,2,3,4,5};
IntStream stream1 = Arrays.stream(nums);

//使用 Stream.of() 方法创建包含指定元素的流
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);

2.常见的中间操作API

1.filter():接收一个参数,用于筛选数据源中满足条件的数据,返回一个新的流

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
// 过滤出名字长度大于3的元素
Stream<String> filteredStream = names.stream().filter(name -> name.length() > 3);

2.map():接收一个function参数,用于对流中某个元素进行映射操作,返回一个新的流

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

// 将每个元素乘以2
Stream<Integer> mappedStream = numbers.stream().map(num -> num * 2);

3.sorted():对流中的元素进行排序,默认是自然顺序排序,也可以传入自定义的 Comparator 进行排序

List<Integer> numbers = Arrays.asList(5, 3, 1, 4, 2);

// 对元素进行排序
Stream<Integer> sortedStream = numbers.stream().sorted();

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

List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 3, 4, 5, 5);

// 去除重复元素
Stream<Integer> distinctStream = numbers.stream().distinct();

5.limit(long)skip(long):分别用于限制流中元素的数量和跳过前几个元素。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

// 只取前3个元素
Stream<Integer> limitedStream = numbers.stream().limit(3);

// 跳过前2个元素
Stream<Integer> skippedStream = numbers.stream().skip(2);

常见的终端操作API

终端操作用于触发流的处理,并生成最终的结果或副作用。终端操作是流处理的最后一步,在执行终端操作后,流将不再可用。
1.forEach(Consumer):对流中的每个元素执行指定的操作。通常用于迭代流中的元素。

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

// 打印每个名字
names.stream().forEach(System.out::println);

2.collect(Collector):将流中的元素收集到一个集合或其他数据结构中。Collector 定义了如何将流中的元素收集到目标容器中。

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

// 将名字收集到一个新的列表中
List<String> collectedNames = names.stream().collect(Collectors.toList());

3.reduce(BinaryOperator):通过指定的二元操作符对流中的元素进行归约操作,返回一个包含归约结果的 Optional 对象。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

// 对所有数字求和
Optional<Integer> sum = numbers.stream().reduce((x, y) -> x + y);

4.count():返回流中元素的数量。

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

// 统计名字的数量
long count = names.stream().count();

5.anyMatch(Predicate)、allMatch(Predicate)、noneMatch(Predicate):用于检查流中的元素是否满足指定条件。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

// 检查是否存在大于3的数字
boolean anyMatch = numbers.stream().anyMatch(num -> num > 3);

// 检查是否所有数字都小于10
boolean allMatch = numbers.stream().allMatch(num -> num < 10);

// 检查是否不存在负数
boolean noneMatch = numbers.stream().noneMatch(num -> num < 0);

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值