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

# JAVA中的Stream学习

JAVA中的Stream

1、Stream是什么?

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

2、Stream能够做什么?

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

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

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

4、Stream怎么使用?

1. 创建 Stream

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

2. 中间操作

filter

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

map

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

flatMap

  • 功能:将多个流合并成一个流。
  • 示例:
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

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

sorted

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

limit

  • 功能:限制流的大小,返回前 n 个元素。
  • 示例:
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 个元素。
  • 示例:
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

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

collect

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

reduce

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

anyMatch

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

allMatch

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

noneMatch

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

findFirst

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

findAny

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

count

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

max

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

min

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

toArray

  • 功能:将流转换为数组。
  • 示例:
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.kler.cn/a/399094.html

相关文章:

  • FastGPT部署通义千问Qwen和智谱glm模型|OneAPI配置免费的第三方API
  • Essential Cell Biology--Fifth Edition--Chapter one (8)
  • 【异常解决】Linux shell报错:-bash: [: ==: 期待一元表达式 解决方法
  • 【H3C华三 】VRRP与BFD、Track联动配置案例
  • Spark 之 Cache
  • STM32设计防丢防摔智能行李箱
  • STM32设计防丢防摔智能行李箱
  • 计算机毕业设计 | springboot+vue大学城水电管理系统 校园学校物业水电管理(附源码+文档)
  • Spring:IoC/DI加载properties文件
  • opencv kdtree pcl kdtree 效率对比
  • Linux中开启 Vim 之旅:从快捷键到插件的实用手册
  • Android【01】TRTC实现跨应用屏幕录制
  • STL序列式容器之list
  • 企业案例:钉钉宜搭对接金蝶云星空
  • HTML5拖拽API学习 托拽排序和可托拽课程表
  • 使用CNN进行验证码识别:深度学习与图像预处理教程
  • conda创建 、查看、 激活、删除 python 虚拟环境
  • 高效协作:前后端合作规范与应对策略优化
  • Day18 Nim游戏
  • 搜维尔科技:SenseGlove触觉反馈手套开箱+场景测试
  • layui.all.js:2 Uncaught Error: Syntax error, unrecognized expression
  • QDataStream
  • vue项目使用eslint+prettier管理项目格式化
  • 阿里巴巴通义灵码推出Lingma SWE-GPT:开源模型的性能新标杆
  • B-树特点以及插入、删除数据过程
  • 使用Python编写一个简单的网页爬虫,从网站抓取新闻标题和链接。