Java——Stream流式编程

  本文记录一下Java8新特性Stream流式编程的使用。

一、什么是Stream流式操作

  Stream流式操作,就是学习java.util.stream包下的API,Stream不同于java的输入输出流,是实现对集合(Collection)的复杂操作,例如查找替换过滤映射数据等,集合是一种静态的数据结构,存储在内存中,而Stream是用于计算的,通过CPU实现计算,因此可以认为Stream就是处理集合数据的各种算法流程。

二、Stream流式操作流程

Stream流式操作主要有 3 个步骤:

  • 创建Stream对象:通过一些数据源创建流对象

  • 中间操作:对数据源的数据进行处理(过滤、排序等)

  • 终止操作:一旦执行终止操作, 就执行中间的链式操作,并产生结果。

三、3个步骤详细解析

1. 创建Stream对象

  创建stream流对象有以下几种方式:

  • 通过集合创建 Stream
  • 通过数组创建 Stream
  • 通过 Stream 的 of()方法

Stream流是不会改变源对象的,而是返回一个新的持有结果的Stream

2. 中间操作

  当使用Java中的Stream进行流式操作时,可以使用各种中间操作方法来对流中的元素进行处理。下面介绍一下常用的中间方法:

1. filter(Predicate)

根据给定的条件(Predicate)过滤流中的元素,只保留符合条件的元素。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evenNumbers = numbers.stream()
                                   .filter(num -> num % 2 == 0)
                                   .collect(Collectors.toList()); //[2, 4]
2. map(Function)

将流中的每个元素映射另一个元素,生成一个新的流。

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<Integer> nameLengths = names.stream()
                                 .map(String::length)  //映射为长度
                                 .collect(Collectors.toList()); //  [5, 3, 7]
3. sorted()

对流中的元素进行排序,默认是自然顺序排序,也可以传入Comparator进行自定义排序。

List<Integer> numbers = Arrays.asList(3, 1, 4, 1, 5, 9, 2, 6, 5);
List<Integer> sortedNumbers = numbers.stream()
                                     .sorted()
                                     .collect(Collectors.toList()); //  [1, 1, 2, 3, 4, 5, 5, 6, 9]
4. distinct()

去除流中重复的元素,得到一个去重后的新流。

List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 3, 3, 4, 4, 4, 4);
List<Integer> distinctNumbers = numbers.stream()
                                       .distinct()
                                       .collect(Collectors.toList());// [1, 2, 3, 4]
5. limit(long)

截取流中的前几个元素,生成一个新的流。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> limitedNumbers = numbers.stream()
                                      .limit(3)
                                      .collect(Collectors.toList());// [1, 2, 3]
6. skip(long)

跳过流中的前几个元素,生成一个新的流。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> skippedNumbers = numbers.stream()
                                      .skip(2)
                                      .collect(Collectors.toList());// [3, 4, 5]

上面的都是Stream中常用的中间操作方法,通过这些方法可以对流中的元素进行过滤、映射、排序、去重、截取等操作。

3. 终止操作

  Stream的终止操作用于触发流的计算(延迟执行)并得到最终的结果,下面介绍一下流式操作常用的终止方法。

1. forEach(Consumer)

对流中的每个元素执行指定的操作

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream()
     .forEach(System.out::println);//控制台输出每个字符串
2. collect(Collector)

将流中的元素收集到一个集合中。可以通过Collectors工具类提供的方法来实现不同类型的收集操作

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> collectedNames = names.stream()
                                   .collect(Collectors.toList());// 将流中的元素收集到List中

3. reduce(BinaryOperator)

对流中的元素进行归约操作,得到一个最终的结果。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
                 .reduce(0, Integer::sum); // 对流中的元素求和
4. count()

返回流中元素的个数

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
long count = names.stream()
                  .count();// 返回3
5. anyMatch(Predicate)

判断流中是否存在任意一个元素满足给定条件

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
boolean hasEvenNumber = numbers.stream()
                               .anyMatch(num -> num % 2 == 0);// 返回true,因为流中存在偶数元素
6. allMatch(Predicate)

判断流中的所有元素是否都满足给定条件

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
boolean allPositive = numbers.stream()
                             .allMatch(num -> num > 0);// 返回true,因为流中所有元素都是正数

以上都是是Stream中常用的终止操作方法。



总结

   本文记录一下Java8新特性Stream流式编程的使用,包括创建流、流的中间操作和流的终止操作常用方法。
  希望对看到本文的你有帮助。



上一篇 Java——函数式接口
记得点赞收藏哦!!!
下一篇 java内部类最全详解(成员内部类、局部内部类、匿名内部类、静态内部类)!!!
  • 27
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值