当前位置: 首页 > news >正文

Java 流 (Stream) 详解

欢迎来到 Java 流 (Stream) 深入讲解,在处理大量数据时,Java 流 (Stream) 可以帮助你更简洁、高效地处理数据。

1. Stream API 简介

  • 概念: Stream 是一个数据处理管道,可以将数据进行过滤、排序、转换等操作。

  • 优势:

    • 简洁: 使用流可以写出更简洁的代码。

    • 高效: 流可以并行处理数据,提高性能。

    • 可读性: 流的代码更易于理解。

2. 创建 Stream

  • 从集合创建:

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
Stream<String> stream = names.stream();
  • 从数组创建:

String[] names = {"Alice", "Bob", "Charlie", "David"};
Stream<String> stream = Arrays.stream(names);
  • 使用 Stream.of():

Stream<String> stream = Stream.of("Alice", "Bob", "Charlie", "David");

3. Stream 操作

3.1 中间操作: 不产生结果,返回新的 Stream。

  • filter: 过滤元素。

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> longNames = names.stream().filter(name -> name.length() > 4).collect(Collectors.toList());
  • limit: 获取前 n 个元素。

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> firstTwoNames = names.stream().limit(2).collect(Collectors.toList());
  • skip: 跳过前 n 个元素。

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> lastTwoNames = names.stream().skip(2).collect(Collectors.toList());
  • distinct: 去重。

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Alice");
List<String> uniqueNames = names.stream().distinct().collect(Collectors.toList());
  • concat: 合并两个流。

Stream<String> stream1 = Stream.of("Alice", "Bob");
Stream<String> stream2 = Stream.of("Charlie", "David");
Stream<String> combinedStream = Stream.concat(stream1, stream2);
  • map: 转换元素。

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<Integer> lengths = names.stream().map(String::length).collect(Collectors.toList());

3.2 终结操作: 产生结果。

  • forEach: 遍历元素。

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
names.stream().forEach(System.out::println);
  • count: 统计元素个数。

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
long count = names.stream().count();
  • toArray: 收集元素到数组。

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
String[] namesArray = names.stream().toArray(String[]::new);
  • collect: 收集元素到集合。

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> upperCaseNames = names.stream().map(String::toUpperCase).collect(Collectors.toList());

4. Stream 的练习 

示例 1: 处理和筛选数字列表

这个示例展示了如何使用流的中间方法(如 filter 和 map)和终结方法(如 collect 和 forEach)来处理和筛选数字列表。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class StreamDemo1 {public static void main(String[] args) {// 创建一个整数列表List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);// 使用流的中间方法和终结方法处理数据List<Integer> result = numbers.stream()  // 创建流.filter(n -> n % 2 == 0)             // 中间方法: 过滤出偶数.map(n -> n * n)                    // 中间方法: 计算每个偶数的平方.collect(Collectors.toList());      // 终结方法: 将结果收集到列表中// 打印结果System.out.println("偶数的平方: " + result);// 使用流的终结方法直接输出System.out.println("偶数的平方(直接输出):");numbers.stream().filter(n -> n % 2 == 0)             // 中间方法: 过滤出偶数.map(n -> n * n)                    // 中间方法: 计算每个偶数的平方.forEach(System.out::println);     // 终结方法: 直接输出每个平方}
}

解释:

  • numbers.stream():将列表转换为流。
  • filter(n -> n % 2 == 0):中间方法,筛选出偶数。
  • map(n -> n * n):中间方法,将每个偶数映射为它的平方。
  • collect(Collectors.toList()):终结方法,将处理结果收集到新的列表中。
  • forEach(System.out::println):终结方法,直接打印每个平方值。

 

示例 2: 处理员工数据

这个示例展示了如何使用流的中间方法(如 sorted 和 distinct)和终结方法(如 count 和 toList)来处理员工数据列表。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class StreamDemo2 {public static void main(String[] args) {// 创建一个员工数据列表List<String> employees = Arrays.asList("Alice", "Bob", "Charlie", "Alice", "David", "Bob", "Eve");// 使用流的中间方法和终结方法处理数据long uniqueCount = employees.stream()       // 创建流.distinct()                           // 中间方法: 去重.sorted()                             // 中间方法: 排序.peek(System.out::println)            // 中间方法: 打印每个元素(调试用).count();                             // 终结方法: 计算去重后元素的数量// 打印去重后的员工名称System.out.println("去重后的员工名称:");List<String> sortedUniqueEmployees = employees.stream().distinct()                           // 中间方法: 去重.sorted()                             // 中间方法: 排序.collect(Collectors.toList());        // 终结方法: 将结果收集到列表中// 打印结果System.out.println(sortedUniqueEmployees);System.out.println("去重后的员工数量: " + uniqueCount);}
}

解释:

  • employees.stream():将列表转换为流。
  • distinct():中间方法,去除重复的元素。
  • sorted():中间方法,对元素进行排序。
  • peek(System.out::println):中间方法,用于调试,打印流中的每个元素。
  • count():终结方法,计算流中元素的数量。
  • collect(Collectors.toList()):终结方法,将处理结果收集到新的列表中。

结语:Java 流可以帮助你更简洁、高效地处理数据,以上就是关于其的讲解,希望对各位看官有所帮助,感谢各位看官的观看,下期见,谢谢~

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 电气自动化入门01:电工基础
  • 整型提升整型提升练习题
  • 用于稀疏自适应深度细化的掩码空间传播网络 CVPR2024
  • 前端基础知识+算法(一)
  • Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 死亡对象判断方法
  • pytorch快速入门(一)—— 基本工具及平台介绍
  • WebGL系列教程八(GLSL着色器基础语法)
  • 采用qt做一个命令行终端
  • 面向对象程序设计之继承(C++)
  • ai 回答HFS是什么 HTTP的文件服务器是什么
  • Leetcode3282. 到达数组末尾的最大得分
  • new/delete和malloc/free到底有什么区别
  • VUE + NODE 历史版本安装
  • AWTK fscript 中的 value 扩展函数
  • synchronized的详解、锁的升级过程和优缺点比较
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • Cumulo 的 ClojureScript 模块已经成型
  • HTTP中GET与POST的区别 99%的错误认识
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • Javascript编码规范
  • leetcode-27. Remove Element
  • PAT A1017 优先队列
  • spring boot下thymeleaf全局静态变量配置
  • sublime配置文件
  • Twitter赢在开放,三年创造奇迹
  • 从PHP迁移至Golang - 基础篇
  • 关于字符编码你应该知道的事情
  • 老板让我十分钟上手nx-admin
  • 力扣(LeetCode)56
  • 如何在GitHub上创建个人博客
  • 使用agvtool更改app version/build
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 正则学习笔记
  • Hibernate主键生成策略及选择
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​业务双活的数据切换思路设计(下)
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #stm32整理(一)flash读写
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • #在 README.md 中生成项目目录结构
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (Matlab)使用竞争神经网络实现数据聚类
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (SpringBoot)第七章:SpringBoot日志文件
  • (编译到47%失败)to be deleted
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (一)RocketMQ初步认识
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)负载均衡,回话保持,cookie
  • .NET CORE 3.1 集成JWT鉴权和授权2