首页 > 编程语言 >Java流式编程(Stream API部分)

Java流式编程(Stream API部分)

时间:2024-12-05 23:01:54浏览次数:13  
标签:Collectors Java Stream stream 元素 流中 API 数组

一、流式编程

在 Java 流式编程中,流(Stream)是一个抽象的概念,用于表示数据的序列。流提供了一种高级迭代的机制,允许你以声明式方式处理数据集合。

1.1.流式编程概述

流是一个元素序列,这些元素可以是集合中的元素,也可以是来自于数组、I/O通道、生成器函数等。

Stream流的作用是结合Lambda表达式,简化集合、数组的操作

对于Stream流的使用步骤总结成以下:

1.2.创建流

1. 从集合创建流

集合(如 List、Set)是最常见的流数据源。集合提供了 stream() 方法,直接用来创建流

List<String> words = Arrays.asList("apple", "banana", "cherry");
Stream<String> stream = words.stream(); // 创建流

注意如HashMap等双列集合没法直接用该方法

2. 从数组创建流

Java 提供了 Arrays.stream() 方法,用于从数组创建流。这个方法可以处理对象数组或基本类型数组

String[] fruits = {"apple", "banana", "cherry"};
Stream<String> stream = Arrays.stream(fruits); 

3. 使用 Stream.of() 创建流

Stream<String> stream = Stream.of("apple", "banana", "cherry");

4、使用 Stream.iterate() 或generate()创建无限流

Stream.iterate() 方法用于创建一个无限流,它接受一个初始值和一个有返回值的函数,每次调用该函数来生成序列中的下一个元素

Stream<Long> infiniteStream = Stream.iterate(1, n -> n + 1);

最后常见获取流的几种方法总结成下表

单列集合default Stream<E> stream()Collection中的默认方法
双列集合无法直接使用stream流
数组public static<T> Stream<T> stream(T[] array)Arrays工具类中的静态方法
一堆零散的数据public static<T> Stream<T> of(T... values)Stream接口中的静态方法

需要注意的是:Stream接口中的of方法,它的形参是一个可变参数,除了可以传递零散数据还可以传递数组。但是数组必须是引用数据类型的,如果是基本数据类型是会把整个数组当作一个元素,放到Stream中。

二、流式操作

2.1.Stream流的中间方法

2.1.1.filter

filter(Predicate<? super T> predicate)筛选流中的元素,只有满足给定谓词的元素才会被保留在流中。

Stream<String> filteredStream = strings.stream().filter(s -> s.startsWith("a"));

2.1.2.limit

limit(long maxSize)截断流,使其最多包含给定数量的元素。

Stream<String> limitedStream = strings.stream().limit(2);

2.1.3.skip、distinct、concat

分别是skip(long n)跳过前几个元素,distinct()元素去重依赖(hashCode和equals方法)以及concat(Stream a,Stream b)合并a和b两个流为一个流。

2.1.4.map

 map(Function<? super T,? extends R> mapper)将流中的每个元素映射到另一个元素上,返回一个新的流。

Stream<Integer> lengthStream = strings.stream().map(String::length);

2.2.Stream流的终结方法

2.2.1.forEach

forEach(Consumer<? super T> action)对流中的每个元素执行给定的操作。

stream.forEach(System.out::println); // 打印流中的每个元素

这里详细解释一下里面的Consumer<? super T> action,它 是一个函数式接口,它定义了一个 accept 方法,用于接收单个输入参数并执行某些操作。源码如下:

2.2.2.reduce

reduce()通过某个连接动作将所有元素汇总成一个汇总结果。

Optional<Integer> sum = stream.reduce((x, y) -> x + y); // 求和

2.2.3.toArray

toArray()将流中的元素收集到数组中。

Object[] array = stream.toArray(); // 将流转换为数组

注意:toArray方法的底层,会依次得到流里面的每一个数据,并把数据放到数组中。

2.2.4.收集方法collect

collect(Collector<? super T, A, R> collector)将流中的元素汇总到一个结果容器中。在 Java 的 Stream API 中,collect 方法是一个非常强大的终端操作。这个方法接受一个 Collector 对象作为参数,该对象定义了如何将流中的元素收集到一个特定的容器中。

List<T> list = stream.collect(Collectors.toList()); // 将流收集到列表

常用的 Collector 实现

Java 8 提供了一些常用的 Collector 实现,它们位于 java.util.stream.Collectors 类中。以下是一些常用的 Collector:

  • Collectors.toList():将流中的元素收集到一个 List 中。
  • Collectors.toSet():将流中的元素收集到一个 Set 中。
  • Collectors.toMap():将流中的元素收集到一个 Map 中。
  • Collectors.joining():将流中的元素连接成一个字符串。
  • Collectors.summing():计算流中元素的总和。
  • Collectors.maxBy():找到流中最大的元素。
  • Collectors.groupingBy():根据某个属性将流中的元素分组。
  • Collectors.partitioningBy():根据某个条件将流中的元素分为两组。

标签:Collectors,Java,Stream,stream,元素,流中,API,数组
From: https://blog.csdn.net/qq_52295468/article/details/144196397

相关文章

  • MySQL-Connector-Java 连接 MySQL 数据库实战
    简介:MySQL-Connector-Java是MySQL官方提供的Java数据库连接器,它允许Java应用程序与MySQL数据库进行通信。本实战项目将指导你如何安装、使用MySQL-Connector-Java,并通过代码示例演示如何连接数据库、执行SQL语句和处理结果集。你将学习JDBC的基本概念,并了解连......
  • 基于java的小区租拼车管理信息系统小程序设计与实现(源码+数据库+文档)
    小区租拼车管理系统目录基于java的小区租拼车管理信息系统小程序设计与实现一、前言二、系统功能设计 三、系统实现 四、数据库设计五、核心代码 六、论文参考七、最新计算机毕设选题推荐八、源码获取:博主介绍:✌️大厂码农|毕设布道师,阿里云开发社区乘风者计......
  • 随机链表的复制(java),注意NullPointerException
    题目描述:给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 rand......
  • JavaScript中todolist操作--待办事项的添加 删除 完成功能
    效果图在文本框中输入内容点击添加按钮会在下面生成添加功能html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><......
  • java实现树的遍历
    packagetree;importjava.util.*;publicclassBinaryTree{ publicTreeNoderoot; publicvoidinsert(intdate) { TreeNodenewNode=newTreeNode(date); if(root==null) { root=newNode; return; } TreeNodecurrentNode=root; while(true) {......
  • JavaScript定时器
    1.setInterval(functiontime)周期定时器vari=0setInterval(function(){console.log(i++)},3000)//3000指的是3000毫秒也就是3s//这个事件会每隔三秒显示一个i每次i++2.setTimeout延迟定时器setTimeout(function(){console.log(i++)},3000)//这个是打......
  • fastapi初见
    最近想学习一类pythonweb开发框架,在前辈的推荐下,开始对fastapi进行学习。发现fastapi超好的官方指导文档,现记录自己的学习过程,希望自己能在学习中能有所收获和成长官方文档地址:https://fastapi.tiangolo.com/zh/特点根据官方文档的介绍,fastapi具备:高性能,易于学习,高效编码,生......
  • Java篇String类的常见方法
    目录1.创建字符串2.获取字符串长度3.字符串拼接4.字符串比较5.查找字符或子字符串6.字符串截取7.字符串替换8.字符串分割9.字符串转换10.字符串格式化11.字符串转字符数组12.检查字符串是否为空或空白13.字符串连接14.字符串的哈希值15.字符串的......
  • JavaScript核心语法(2)
    这篇文章属于是一点大杂烩。,因为我整理了一下JavaScript的一些语法,我发现有几个知识点是很散的,我原本想每个知识点都整理成一篇文章,但是后来发现没多少可写的,所以我就打算将这些大杂烩的知识点放到这里来。语句和表达式JavaScript程序是一行一行执行的。一般情况下,每一行就......
  • 【学习总结|DAY012】Javabean书写练习
    一、主要代码publicclassPhone{publicPhone(){}publicPhone(Stringbrand,intprice,Stringcolor){this.brand=brand;this.price=price;this.color=color;}Stringbrand;intprice;String......