Stream 流式编程创建及其常用操作方法

目录

[Stream 对象如何创建](#Stream 对象如何创建)

[Stream 常用的操作方法](#Stream 常用的操作方法)

1.过滤(Filter)

2.映射(Map)

3.扁平映射(FlatMap)

4.截断(Limit)

5.跳过(Skip)

6.排序(Sorted)

7.去重(Distinct)

8.汇总(Collect)

9.归约(Reduce)

[10.统计(Summary Statistics)](#10.统计(Summary Statistics))


Stream 对象如何创建

在Java中,可以通过多种方式创建Stream对象。下面列举了几个常用的方法:

  1. 从集合创建Stream:可以使用stream()方法从Collection接口的实现类(如List、Set)中创建Stream对象。
  2. 从数组创建Stream:可以使用Arrays.stream()方法从数组中创建Stream对象。
  3. 其他方法:还可以使用各种I/O操作、日期时间API等创建特定类型的Stream对象。
  4. 通过Stream的静态方法创建Stream:Stream类提供了一些静态方法来创建Stream对象。

1)使用Stream.of()方法可以接受任意数量的参数,并将它们转换为Stream对象。

2)使用Stream.iterate()方法可以生成一个包含无限序列的Stream对象,需要传入初始值和生成下一个元素的函数。

3)使用Stream.generate()方法可以生成一个包含无限元素的Stream对象,需要传入生成元素的函数。

java 复制代码
package com.common.demo.stream;

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.List;
import java.util.stream.IntStream;
import java.util.stream.Stream;

/**
 * @author Evan Walker
 * @version 1.0
 * @desc
 * @date 2023/10/09 21:46:25
 */
public class StreamDemo {

    public static void main(String[] args) throws Exception {
        // 在Java中,可以通过多种方式创建Stream对象。下面列举了几个常用的方法:

        // 从集合创建Stream:可以使用stream()方法从Collection接口的实现类(如List、Set)中创建Stream对象。
        List<String> list = Arrays.asList("a", "b", "c");
        Stream<String> stream1 = list.stream();
        // 从数组创建Stream:可以使用Arrays.stream()方法从数组中创建Stream对象。

        int[] array = {1, 2, 3, 4, 5};
        IntStream stream2 = Arrays.stream(array);

        //其他方法:还可以使用各种I/O操作、日期时间API等创建特定类型的Stream对象。
        Stream<Path> stream3 = Files.list(Paths.get("dir"));
        Stream<LocalDate> stream7 = LocalDate.now().datesUntil(LocalDate.now().plusDays(7));

        //通过Stream的静态方法创建Stream:Stream类提供了一些静态方法来创建Stream对象。
        //使用Stream.of()方法可以接受任意数量的参数,并将它们转换为Stream对象。
        Stream<String> stream4 = Stream.of("a", "b", "c");

        //使用Stream.iterate()方法可以生成一个包含无限序列的Stream对象,需要传入初始值和生成下一个元素的函数。
        Stream<Integer> stream5 = Stream.iterate(0, n -> n + 1);

        // 使用Stream.generate()方法可以生成一个包含无限元素的Stream对象,需要传入生成元素的函数。
        Stream<Double> stream6 = Stream.generate(Math::random);

    }
}

这些只是创建Stream对象的一些常用方法,根据不同的需求和数据源,可以选择适合的方式来创建Stream。创建Stream后,可以通过链式调用中间操作和终止操作来对数据进行处理和操作。

Stream 常用的操作方法

1.过滤(Filter)

filter() 方法接受一个 Predicate 函数作为参数,用于过滤 Stream 中的元素。只有满足 Predicate 条件的元素会被保留下来。例如:

java 复制代码
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<Integer> filteredStream = stream.filter(n -> n % 2 == 0); // 过滤出偶数

2.映射(Map)

map() 方法接受一个 Function 函数作为参数,用于对 Stream 中的元素进行映射转换。对每个元素应用函数后的结果会构成一个新的 Stream。例如:

java 复制代码
Stream<String> stream = Stream.of("apple", "banana", "cherry"); 
Stream<Integer> mappedStream = stream.map(s -> s.length()); // 映射为单词长度

3.扁平映射(FlatMap)

flatMap() 方法类似于 map() 方法,不同之处在于它可以将每个元素映射为一个流,并将所有流连接成一个流。这主要用于解决嵌套集合的情况。例如:

java 复制代码
List<List<Integer>> nestedList = Arrays.asList( Arrays.asList(1, 2), Arrays.asList(3, 4), Arrays.asList(5, 6) ); 
Stream<Integer> flattenedStream = nestedList.stream().flatMap(List::stream); // 扁平化为一个流

4.截断(Limit)

limit() 方法可以限制 Stream 的大小,只保留前 n 个元素。例如

java 复制代码
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5); 
Stream<Integer> limitedStream = stream.limit(3); // 只保留前 3 个元素

5.跳过(Skip)

skip() 方法可以跳过 Stream 中的前 n 个元素,返回剩下的元素组成的新 Stream。例如:

java 复制代码
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5); 
Stream<Integer> skippedStream = stream.skip(2); // 跳过前 2 个元素

6.排序(Sorted)

sorted() 方法用于对 Stream 中的元素进行排序,默认是自然顺序排序。还可以提供自定义的 Comparator 参数来指定排序规则。例如:

java 复制代码
Stream<Integer> stream = Stream.of(5, 2, 4, 1, 3); 
Stream<Integer> sortedStream = stream.sorted(); // 自然顺序排序

7.去重(Distinct)

``distinct() 方法用于去除 Stream 中的重复元素,根据元素的 equals()hashCode() 方法来判断是否重复。例如:

java 复制代码
Stream<Integer> stream = Stream.of(1, 2, 2, 3, 3, 3); 
Stream<Integer> distinctStream = stream.distinct(); // 去重

8.汇总(Collect)

``collect() 方法用于将 Stream 中的元素收集到结果容器中,如 List、Set、Map 等。可以使用预定义的 Collectors 类提供的工厂方法来创建收集器,也可以自定义收集器。例如:

java 复制代码
Stream<String> stream = Stream.of("apple", "banana", "cherry"); 
List<String> collectedList = stream.collect(Collectors.toList()); // 收集为 List

9.归约(Reduce)

reduce() 方法用于将 Stream 中的元素依次进行二元操作,得到一个最终的结果。它接受一个初始值和一个 BinaryOperator 函数作为参数。例如:

java 复制代码
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5); 
Optional<Integer> sum = stream.reduce((a, b) -> a + b); // 对所有元素求和

10.统计(Summary Statistics)

summaryStatistics() 方法可以从 Stream 中获取一些常用的统计信息,如元素个数、最小值、最大值、总和和平均值。例如:

java 复制代码
IntStream stream = IntStream.of(1, 2, 3, 4, 5); 
IntSummaryStatistics stats = stream.summaryStatistics(); 
System.out.println("Count: " + stats.getCount()); 
System.out.println("Min: " + stats.getMin()); 
System.out.println("Max: " + stats.getMax()); 
System.out.println("Sum: " + stats.getSum()); 
System.out.println("Average: " + stats.getAverage());

以上只是 Stream API 提供的一部分常用操作方法,还有许多其他操作方法,如匹配(Match)、查找(Find)、遍历(ForEach)等。

更多消息资讯,请访问****昂焱数据****https://www.ayshuju.com

相关推荐
陈小桔10 分钟前
idea中重新加载所有maven项目失败,但maven compile成功
java·maven
小学鸡!10 分钟前
Spring Boot实现日志链路追踪
java·spring boot·后端
xiaogg367822 分钟前
阿里云k8s1.33部署yaml和dockerfile配置文件
java·linux·kubernetes
逆光的July38 分钟前
Hikari连接池
java
微风粼粼1 小时前
eclipse 导入javaweb项目,以及配置教程(傻瓜式教学)
java·ide·eclipse
番茄Salad1 小时前
Spring Boot临时解决循环依赖注入问题
java·spring boot·spring cloud
立志成为大牛的小牛1 小时前
数据结构——二十六、邻接表(王道408)
开发语言·数据结构·c++·学习·程序人生
天若有情6731 小时前
Spring MVC文件上传与下载全面详解:从原理到实战
java·spring·mvc·springmvc·javaee·multipart
祈祷苍天赐我java之术1 小时前
Redis 数据类型与使用场景
java·开发语言·前端·redis·分布式·spring·bootstrap
MediaTea2 小时前
Python 第三方库:matplotlib(科学绘图与数据可视化)
开发语言·python·信息可视化·matplotlib