Java 流 (Stream) 详解

embedded/2024/9/24 16:07:04/

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

1. Stream API 简介

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

  • 优势:

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

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

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

2. 创建 Stream

  • 从集合创建:

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

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

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

3. Stream 操作

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

  • filter: 过滤元素。

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

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

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

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

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

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

3.2 终结操作: 产生结果。

  • forEach: 遍历元素。

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

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

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

java">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)来处理和筛选数字列表。

java">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)来处理员工数据列表。

java">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 流可以帮助你更简洁、高效地处理数据,以上就是关于其的讲解,希望对各位看官有所帮助,感谢各位看官的观看,下期见,谢谢~


http://www.ppmy.cn/embedded/112728.html

相关文章

数据库之索引<保姆级文章>

目录&#xff1a; 一. 什么是索引 二. 索引应该选择哪种数据结构 三. MySQL中的页 四. 索引分类及使用 一. 什么是索引&#xff1a; 1. MySQL的索引是⼀种数据结构&#xff0c;它可以帮助数据库高效地查询、更新数据表中的数据。 索引通过 ⼀定的规则排列数据表中的记录&#x…

【CMake】使用CMake在Visual Stdudio构建一个最简单的项目

一、准备工作 首先&#xff0c;确保在 V i s u a l S t u d i o Visual\ Studio Visual Studio上安装了 C C C桌面开发&#xff0c;如果没有安装&#xff0c;打开 V i s u a l S t u d i o I n s t a l l e r Visual\ Studio\ Installer Visual Studio Installer就可以修改…

Brave编译指南2024 Windows篇:安装Git(四)

1.引言 在编译Brave浏览器的过程中&#xff0c;Git是必不可少的工具之一。作为最流行的分布式版本控制系统&#xff0c;Git允许开发者高效地管理和协作开发源码。通过Git&#xff0c;您可以轻松获取、更新和提交Brave的源码版本&#xff0c;并跟踪所有更改记录。无论是独立开发…

网络安全(黑客技术)2024新版自学手册路线

&#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 前言 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、…

开发游戏的学习规划

第一阶段&#xff1a; ● C#语言快速系统地学习一遍&#xff08;基础的语法、面向对象、基础的数据结构、基础的设计模式&#xff09; ● Unity的2D和3D部分及UI、动画、物理系统 ● 阶段性测验&#xff1a; 需要去用前面所学的这些基础知识来完成一个简单的2d或者3d的案例&…

UE5 性能分析 UnrealInsights

Unreal Insights会话浏览器 &#xff08;Unreal Insights Session Browser&#xff09;是一个观察跟踪数据的界面。 一、开启UnrealInsights 以通过UE编辑器启动&#xff0c;请前往底部工具栏&#xff0c;然后点击Trace>Insights>Unreal Insights(Session Browser)。 …

DevExpress WinForms中文教程:Data Grid - 如何自定义行和单元格的样式?

在本教程中您将学习如何使用事件更改数据单元格样式&#xff0c;您将从要给显示任务数据的网格开始&#xff0c;并且没有应用条件格式。通过处理GridView.RowStyle事件&#xff0c;您将对Priority字段值为High的行应用不同的背景颜色。然后如果Status设置为New&#xff0c;您将…

livox mid360不使用ros接收雷达数据

源头还是使用官方的ROS版本的驱动修改得到的&#xff0c;一个不使用ROS的LIVOX-MID360的驱动 需要安装mid360的 SDK 在.cpp中 std::string m_IP "192.168.192.46"设置雷达的IP地址 在config.json 文件中&#xff0c;修改 "cmd_data_ip" : "192.16…