# JAVA中的Stream学习

ops/2024/11/18 19:15:28/

JAVA中的Stream

1、Stream是什么?

  • Stream 是 Java 8 引入的一个新的抽象层,用于处理数据集合。
  • 它可以让你以声明式的方式处理数据,类似于 SQL 语句的查询方式。

2、Stream能够做什么?

  • 过滤:通过条件筛选数据。
  • 映射:转换数据结构或类型。
  • 排序:对数据进行排序。
  • 聚合:如求和、最大值、最小值等。
  • 匹配与查找:检查某些条件是否满足,或者查找特定元素。

3、Stream能给我带来什么好处?

  • 简洁性:使用 Stream 可以让代码更加简洁、易读。
  • 高效性:Stream 操作可以自动并行化,提高处理效率。
  • 声明式编程:关注“做什么”而不是“怎么做”,降低出错概率。

4、Stream怎么使用?

1. 创建 Stream

从集合创建
java">List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
从数组创建
java">int[] array = {1, 2, 3};
IntStream stream = Arrays.stream(array);
从文件创建
java">try (Stream<String> lines = Files.lines(Paths.get("file.txt"))) {lines.forEach(System.out::println);
} catch (IOException e) {e.printStackTrace();
}

2. 中间操作

filter

  • 功能:过滤元素,只保留满足条件的元素。
  • 示例:
java">List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> shortNames = names.stream().filter(name -> name.length() < 5).collect(Collectors.toList());

map

  • 功能:转换元素,将每个元素映射为另一个元素。
  • 示例:
java">List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
List<Integer> squares = numbers.stream().map(n -> n * n).collect(Collectors.toList());

flatMap

  • 功能:将多个流合并成一个流。
  • 示例:
java">List<List<Integer>> listOfLists = Arrays.asList(Arrays.asList(1, 2),Arrays.asList(3, 4)
);
List<Integer> flattenedList = listOfLists.stream().flatMap(List::stream).collect(Collectors.toList());

distinct

  • 功能:去重,去除重复的元素。
  • 示例:
java">List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4);
List<Integer> uniqueNumbers = numbers.stream().distinct().collect(Collectors.toList());

sorted

  • 功能:排序,对元素进行排序。
  • 示例:
java">List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> sortedNames = names.stream().sorted().collect(Collectors.toList());

limit

  • 功能:限制流的大小,返回前 n 个元素。
  • 示例:
java">List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> firstFive = numbers.stream().limit(5).collect(Collectors.toList());

skip

  • 功能:跳过前 n 个元素。
  • 示例:
java">List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> afterFirstFive = numbers.stream().skip(5).collect(Collectors.toList());

3. 终端操作

forEach

  • 功能:遍历流中的每个元素。
  • 示例:
java">List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream().forEach(System.out::println);

collect

  • 功能:收集结果,将流转换为其他形式的数据结构。
  • 示例:
java">List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> filterNames = names.stream().filter(name -> name.length() < 5).collect(Collectors.toList());

reduce

  • 功能:聚合操作,将流中的元素减少为一个值。
  • 示例:
java">List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream().reduce(0, Integer::sum);

anyMatch

  • 功能:检查流中是否有任何元素满足给定的条件。
  • 示例:
java">List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
boolean anyStartsWithA = names.stream().anyMatch(name -> name.startsWith("A"));

allMatch

  • 功能:检查流中所有元素是否都满足给定的条件。
  • 示例:
java">List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
boolean allStartWithA = names.stream().allMatch(name -> name.startsWith("A"));

noneMatch

  • 功能:检查流中没有任何元素满足给定的条件。
  • 示例:
java">List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
boolean noneStartWithZ = names.stream().noneMatch(name -> name.startsWith("Z"));

findFirst

  • 功能:返回流中的第一个元素。
  • 示例:
java">List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
Optional<String> first = names.stream().findFirst();

findAny

  • 功能:返回流中的任意一个元素。
  • 示例:
java">List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
Optional<String> any = names.stream().findAny();

count

  • 功能:返回流中元素的数量。
  • 示例:
java">List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
long count = names.stream().count();

max

  • 功能:返回流中的最大值。
  • 示例:
java">List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
Optional<Integer> max = numbers.stream().max(Integer::compare);

min

  • 功能:返回流中的最小值。
  • 示例:
java">List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
Optional<Integer> min = numbers.stream().min(Integer::compare);

toArray

  • 功能:将流转换为数组。
  • 示例:
java">List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
String[] array = names.stream().toArray(String[]::new);

5、Stream的原理是什么?

  • 惰性求值:中间操作不会立即执行,只有在终端操作时才会触发整个流水线的执行。
  • 内部迭代:由系统控制迭代过程,而不是显式地编写循环。
  • 并行处理:支持并行流,可以通过 parallelStream() 方法实现。
  • 操作类型:中间操作返回新的 Stream,终端操作触发执行并产生结果。
  • 生命周期:从创建到中间操作再到终端操作,形成完整的流处理流程。

6、Stream总结

  • Stream 是 Java 8 引入的强大工具,简化了集合数据的处理。
  • 通过声明式编程风格,使代码更加简洁、易读。
  • 支持惰性求值和内部迭代,提高了性能和并发处理能力。
  • 在实际开发中,合理使用 Stream 可以显著提升开发效率和代码质量。

http://www.ppmy.cn/ops/134773.html

相关文章

Web前端之汉字排序、sort与localeCompare的介绍、编码顺序与字典顺序的区别

MENU 使用字典顺序对汉字进行排序(不支持多音字)编码顺序和字典顺序的区别sort与localeCompare的介绍 使用字典顺序对汉字进行排序(不支持多音字) 不使用拼音库&#xff0c;利用JavaScript的localeCompare方法直接按汉字的字典序排序。localeCompare可以在比较字符串时指定语言…

Linux中配置ntp服务

NTP&#xff1a;是Network Time Protocol的缩写又 称网络时间协议&#xff0c;是用来使计算机时间同步化的一种协议&#xff0c;用来同步网络中各主机的时 间&#xff0c;在linux系统中早期使用ntp来实现&#xff0c;后来使用chrony来实现。Chrony 应用本身已经有 几年了&#…

搜维尔科技:SenseGlove触觉反馈手套开箱+场景测试

搜维尔科技&#xff1a;SenseGlove触觉反馈手套开箱场景测试 SenseGlove触觉反馈手套开箱场景测试

【IC每日一题:IC常用模块--RR/handshake/gray2bin】

IC每日一题&#xff1a;IC常用模块--RR/handshake/gray2bin 1 RR仲裁器2 异步握手信号处理3 格雷码和二进制相互转换 1 RR仲裁器 应用&#xff1a;在多个FIFO请求pop时存在仲裁策略&#xff0c;还有比如多master申请总线控制权的仲裁等这些应用场合&#xff1b;假如当前是最高…

蓝桥杯每日真题 - 第7天

题目&#xff1a;&#xff08;爬山&#xff09; 题目描述&#xff08;X届 C&C B组X题&#xff09; 解题思路&#xff1a; 前缀和构造&#xff1a;为了高效地计算子数组的和&#xff0c;我们可以先构造前缀和数组 a&#xff0c;其中 a[i] 表示从第 1 个元素到第 i 个元素的…

PySpark——Python与大数据

一、Spark 与 PySpark Apache Spark 是用于大规模数据&#xff08; large-scala data &#xff09;处理的统一&#xff08; unified &#xff09;分析引擎。简单来说&#xff0c; Spark 是一款分布式的计算框架&#xff0c;用于调度成百上千的服务器集群&#xff0c;计算 TB 、…

优化C++设计模式:用模板代替虚函数与多态机制

文章目录 0. 引言1. 模板编程替换虚函数和多态的必要性1.1. MISRA C对类型转换和虚函数的规定1.2. 模板编程的优势&#xff1a;替代虚函数和多态机制 2. 设计模式改进2.1. 单例模式的改进与静态局部变量的对比(第二种实现) 2.2. 工厂模式的改进2.3. 观察者模式的改进2.4. 适配器…

docker 安装之 windows安装

文章目录 1: 在Windows安装Docker报19044版本错误的时候&#xff0c;请大家下载4.24.1之前的版本&#xff08;含4.24.1&#xff09;2: Desktop-WSL kernel version too low3: docker-compose 安装 (v2.21.0)4: 配置镜像源 1: 在Windows安装Docker报19044版本错误的时候&#xf…