别死脑筋,赶紧学起来!Java之Steam() API 常用方法使用,让开发简单起来!

简介: 分享Java Stream API的常用方法,让开发更简单。涵盖filter、map、sorted等操作,提高代码效率与可读性。关注公众号,了解更多技术内容。

原创作者,公众号【IT技术馆】,欢迎关注公众号,转载文章请注明出处哦。

别死脑筋,赶紧学起来!Java之Steam() API 常用方法使用,让开发简单起来!
Java 的 Stream API 是 Java 8 引入的一个关键特性,提供了一种声明性的方式来处理数据集合(如集合、数组等)。通过 Stream API,你可以以简洁、高效的方式执行复杂的查询、过滤、转换和聚合操作。以下是对 Stream API 的详细解释和一些示例。

Java Stream API支持的功能

功能 描述
filter 过滤流中的元素,根据条件只留下满足条件的元素
map 将流中的每个元素映射成其他形式,结果是一个包含映射后结果的新流
sorted 确保流中的元素在消费时的顺序按照自然顺序或自定义Comparator排序
collect 将流转换为其他形式,如List、Set或Map,或者是自定义的收集器
forEach 遍历流中的每个元素并执行给定的操作
reduce 通过重复处理其元素来将流减少到单个汇总结果
anyMatch 检查流中的元素是否有一个满足给定的条件
allMatch 检查流中的元素是否全部满足给定条件
noneMatch 检查流中的元素是否没有满足给定条件的
findFirst 返回流中的第一个元素,如果流为空,则返回空的Optional
limit 截断流,使其最大长度不超过给定数量
skip 跳过流中的前n个元素,返回包含余下元素的新流

使用Java Stream API的优势

功能 Java Stream API 传统集合操作
数据处理模式 声明式,支持函数式编程 命令式,代码较为复杂
内存效率 更高,因为它是在流上直接操作 低,需要复制到新的数据结构
并发处理 内建支持并发处理 手动处理并发
可读性 高,流操作可链式调用 低,循环和条件判断多
使用场景 数据集合操作,大数据处理 小数据量操作

常用的 Java Stream API功能

Java中的Stream API是Java 8引入的一个关键抽象概念,它允许你以声明性方式处理数据集合(如数组、列表等)。Stream API提供了一套丰富的操作来过滤、转换、聚合数据等。以下是Stream API中一些常用的API介绍及示例:

1. 创建Stream

  • 从集合创建:可以使用Collection接口中的stream()方法。
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
  • 从数组创建:可以使用Arrays.stream(T[] array)方法。
int[] array = {
   1, 2, 3};
Stream<Integer> stream = Arrays.stream(array);
  • 创建空Stream:可以使用Stream.empty()方法。
Stream<String> emptyStream = Stream.empty();
  • 使用Stream.of:可以从一组值中创建Stream。
Stream<String> streamOfValues = Stream.of("a", "b", "c");
  • 使用Stream.builder:可以使用Stream.Builder来构建Stream。
Stream.Builder<String> builder = Stream.builder();
builder.add("a");
builder.add("b");
Stream<String> streamFromBuilder = builder.build();

2. 中间操作

中间操作返回一个新的Stream,并且它们是惰性求值的,只有在调用终端操作时才会执行。

  • filter:过滤元素。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> filteredNames = names.stream()
    .filter(name -> name.startsWith("A"))
    .collect(Collectors.toList());
// 输出: ["Alice"]
  • map:将每个元素映射为另一个类型。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<Integer> nameLengths = names.stream()
    .map(String::length)
    .collect(Collectors.toList());
// 输出: [5, 3, 7]
  • sorted:对流中的元素进行排序。
List<String> names = Arrays.asList("Bob", "Alice", "Charlie");
List<String> sortedNames = names.stream()
    .sorted()
    .collect(Collectors.toList());
// 输出: ["Alice", "Bob", "Charlie"]
  • distinct:去除流中的重复元素。
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4);
List<Integer> distinctNumbers = numbers.stream()
    .distinct()
    .collect(Collectors.toList());
// 输出: [1, 2, 3, 4]
  • limit:截取流中的前n个元素。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> limitedNumbers = numbers.stream()
    .limit(3)
    .collect(Collectors.toList());
// 输出: [1, 2, 3]
  • skip:跳过前n个元素。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> skippedNumbers = numbers.stream()
    .skip(2)
    .collect(Collectors.toList());
// 输出: [3, 4, 5]

3. 终端操作

终端操作产生结果或者副作用,并且执行后会结束流。

  • forEach:对流中的每个元素执行某种操作。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream().forEach(System.out::println);
// 输出: Alice, Bob, Charlie
  • collect:将流中的元素收集到某种结果中。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> collectedNames = names.stream()
    .collect(Collectors.toList());
// 输出: ["Alice", "Bob", "Charlie"]
  • reduce:对流中的元素进行累积操作。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream()
    .reduce(0, Integer::sum);
// 输出: 10
  • count:返回流中元素的个数。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
long count = names.stream().count();
// 输出: 3
  • findFirst:返回流中的第一个元素(作为Optional对象)。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
Optional<String> firstName = names.stream()
    .findFirst();
// 输出: Optional["Alice"]
  • anyMatch:检查流中是否有任意元素匹配给定的条件。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
boolean hasAlice = names.stream()
    .anyMatch(name -> name.equals("Alice"));
// 输出: true

4. 其他高级操作

  • flatMap:将流中的每个元素映射为另一个流,并将结果合并为一个流。
List<String> names = Arrays.asList("Alice", null, "Bob", null, "Charlie");
List<String> nonNullNames = names.stream()
    .flatMap(Stream::ofNullable)
    .collect(Collectors.toList());
// 输出: ["Alice", "Bob", "Charlie"]
  • iterate:创建无限的序列流。
Stream.iterate(0, n -> n + 2)
    .limit(10)
    .forEach(System.out::println);
// 输出: 0, 2, 4, 6, 8, 10, 12, 14, 16, 18
  • collectingAndThen:对收集器的结果执行特殊类型的转换。
List<String> fruits = Arrays.asList("apple", "banana", "orange");
Map<Integer, String> result = fruits.stream()
    .collect(Collectors.collectingAndThen(
        Collectors.toMap(fruits::indexOf, String::toUpperCase),
        Collections::unmodifiableMap
    ));
// 输出: {0="APPLE", 1="BANANA", 2="ORANGE"}
  • dropWhiletakeWhile(Java 9+):连续处理流。
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6, 7);
numbers.stream()
    .dropWhile(n -> n < 3)
    .takeWhile(n -> n < 6)
    .forEach(System.out::println);
// 输出: 3, 4, 5
  • IntStream:用于快速生成整数流。
IntStream.range(1, 5).forEach(System.out::println);
// 输出: 1, 2, 3, 4
IntStream.rangeClosed(1, 5).forEach(System.out::println);
// 输出: 1, 2, 3, 4, 5
  • teeing(Java 12+):在元素流上一起应用两个单独的收集器。
Stream<Integer> nums = Stream.of(1, 2, 3, 4, 5);
Map<String, Integer> collect = nums.collect(Collectors.teeing(
    Collectors.maxBy(Integer::compareTo),
    Collectors.minBy(Integer::compareTo),
    (e1, e2) -> Map.of("min", e1.get(), "max", e2.get())
));
// 输出: {max=5, min=1}
  • concat:连接两个流并生成一个新流。
Stream<Integer> stream1 = Stream.of(1, 2, 3);
Stream<Integer> stream2 = Stream.of(4, 5, 6);
Stream.concat(stream1, stream2).forEach(System.out::println);
// 输出: 1, 2, 3, 4, 5, 6
  • partitioningBy:对流进行分组。
Stream<String> fruits = Stream.of("apple", "banana", "orange", "grape");
Map<Boolean, List<String>> result = fruits.collect(Collectors.partitioningBy(f -> f.length() > 5));
// 输出
相关文章
|
14天前
|
Java API Maven
如何使用Java开发抖音API接口?
在数字化时代,社交媒体平台如抖音成为生活的重要部分。本文详细介绍了如何用Java开发抖音API接口,从创建开发者账号、申请API权限、准备开发环境,到编写代码、测试运行及注意事项,全面覆盖了整个开发流程。
58 10
|
15天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
45 2
|
15天前
|
API 开发工具 数据库
开发一份API接口,需要注意这些,看你做到了几项
本文介绍了设计API接口时需注意的关键点,包括数字签名、敏感数据加密与脱敏、限流、参数校验、统一返回与异常处理、请求日志记录、幂等设计、数据量限制、异步处理、参数定义、完整文档及开发者对接SDK等内容,旨在帮助开发者设计出安全、稳定、易维护的API接口。
74 6
开发一份API接口,需要注意这些,看你做到了几项
|
4天前
|
Java 数据处理 数据安全/隐私保护
Java处理数据接口方法
Java处理数据接口方法
14 1
|
11天前
|
缓存 前端开发 API
深入浅出:后端开发中的RESTful API设计原则
【10月更文挑战第43天】在数字化浪潮中,后端开发如同搭建梦想的脚手架,而RESTful API则是连接梦想与现实的桥梁。本文将带你领略API设计的哲学之美,探索如何通过简洁明了的设计,提升开发效率与用户体验。从资源定位到接口约束,从状态转换到性能优化,我们将一步步构建高效、易用、可维护的后端服务。无论你是初涉后端的新手,还是寻求进阶的开发者,这篇文章都将为你的开发之路提供指引。让我们一起走进RESTful API的世界,解锁后端开发的新篇章。
|
18天前
|
存储 SQL API
探索后端开发:构建高效API与数据库交互
【10月更文挑战第36天】在数字化时代,后端开发是连接用户界面和数据存储的桥梁。本文深入探讨如何设计高效的API以及如何实现API与数据库之间的无缝交互,确保数据的一致性和高性能。我们将从基础概念出发,逐步深入到实战技巧,为读者提供一个清晰的后端开发路线图。
|
17天前
|
JSON 前端开发 API
后端开发中的API设计与文档编写指南####
本文探讨了后端开发中API设计的重要性,并详细阐述了如何编写高效、可维护的API接口。通过实际案例分析,文章强调了清晰的API设计对于前后端分离项目的关键作用,以及良好的文档习惯如何促进团队协作和提升开发效率。 ####
|
15天前
|
JSON API 数据格式
如何使用Python开发1688商品详情API接口?
本文介绍了如何使用Python开发1688商品详情API接口,获取商品的标题、价格、销量和评价等详细信息。主要内容包括注册1688开放平台账号、安装必要Python模块、了解API接口、生成签名、编写Python代码、解析返回数据以及错误处理和日志记录。通过这些步骤,开发者可以轻松地集成1688商品数据到自己的应用中。
30 1
|
18天前
|
监控 搜索推荐 安全
探究亚马逊详情API接口:开发与应用
在数字化时代,亚马逊作为全球领先的电商平台,为商家和消费者提供了丰富的商品信息和便捷的购物体验。本文深入探讨了亚马逊详情API接口的获取与运用,帮助开发者和商家实时监控商品数据、分析市场趋势、优化价格策略、分析竞争对手、构建推荐系统及自动化营销工具,从而在竞争中占据优势。文章还提供了Python调用示例和注意事项,确保API使用的安全与高效。
45 3
|
20天前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
40 4