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

Java Stream API 实战:提升集合处理的效率与可读性!

全文目录:

    • 开篇语
    • 前言
    • 什么是Stream API?
      • Stream的操作分为两种类型:
    • 基本操作示例
      • 1. 创建Stream
        • 通过集合创建Stream
        • 通过数组创建Stream
      • 2. 中间操作
        • 过滤操作:`filter()`
        • 映射操作:`map()`
        • 排序操作:`sorted()`
        • 去重操作:`distinct()`
      • 3. 终端操作
        • 收集操作:`collect()`
        • 遍历操作:`forEach()`
        • 聚合操作:`reduce()`
        • 计数操作:`count()`
      • 4. 并行流(Parallel Stream)
      • 5. 组合Stream操作
    • 总结
    • 文末

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

  随着Java 8的发布,Stream API成为了处理集合数据的一个强大工具。Stream API允许我们以声明式的方式处理数据流(如集合、数组等),并使得代码更加简洁和易读。Stream API的引入大大简化了集合的操作,尤其是在需要进行复杂数据处理时,能够提高效率和可维护性。

  本文将通过一系列实际例子,帮助大家深入理解如何在Java中使用Stream API,提升开发效率和代码质量。

什么是Stream API?

  Stream是Java 8引入的一个新特性,它代表了数据的“流”,能够对集合类进行高效的操作,支持多核架构下的并行处理。通过Stream API,我们可以进行诸如过滤、映射、排序、统计等操作,而这些操作都可以通过函数式编程的方式来实现。

Stream的操作分为两种类型:

  1. 中间操作(Intermediate Operations):返回一个新的Stream对象,操作是懒加载的,只有在终端操作执行时才会触发。
  2. 终端操作(Terminal Operations):执行某种操作并生成结果,触发流的处理过程。常见的终端操作有collect()forEach()reduce()等。

基本操作示例

1. 创建Stream

Stream可以从集合、数组或其他数据源中生成。下面我们通过几个简单的例子来展示如何创建Stream。

通过集合创建Stream
import java.util.*;
import java.util.stream.*;public class StreamCreationExample {public static void main(String[] args) {List<String> list = Arrays.asList("Apple", "Banana", "Cherry", "Date");Stream<String> stream = list.stream();stream.forEach(System.out::println);  // 打印所有元素}
}
通过数组创建Stream
public class StreamCreationExample {public static void main(String[] args) {int[] numbers = {1, 2, 3, 4, 5};IntStream stream = Arrays.stream(numbers);stream.forEach(System.out::println);  // 打印所有数字}
}

2. 中间操作

Stream的中间操作通常会返回一个新的Stream,常见的中间操作有:filter()map()sorted()distinct()等。

过滤操作:filter()

filter()方法用于根据给定的条件筛选流中的元素。

public class FilterExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);numbers.stream().filter(n -> n % 2 == 0)  // 过滤出所有偶数.forEach(System.out::println);}
}
映射操作:map()

map()方法用于将每个元素通过给定的函数转换为另一个元素。

public class MapExample {public static void main(String[] args) {List<String> list = Arrays.asList("apple", "banana", "cherry");list.stream().map(String::toUpperCase)  // 转换为大写字母.forEach(System.out::println);}
}
排序操作:sorted()

sorted()方法用于对Stream中的元素进行排序。

public class SortedExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(5, 2, 9, 1, 4, 8);numbers.stream().sorted().forEach(System.out::println);  // 默认升序排序}
}
去重操作:distinct()

distinct()方法用于移除流中的重复元素。

public class DistinctExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4, 5);numbers.stream().distinct()  // 去重.forEach(System.out::println);}
}

3. 终端操作

Stream的终端操作触发实际的计算并返回结果。常见的终端操作有:collect()forEach()reduce()count()等。

收集操作:collect()

collect()方法是最常用的终端操作之一,用于将Stream的元素收集到集合中。

import java.util.*;
import java.util.stream.*;public class CollectExample {public static void main(String[] args) {List<String> list = Arrays.asList("apple", "banana", "cherry", "date");List<String> result = list.stream().filter(s -> s.startsWith("a")).collect(Collectors.toList());  // 将结果收集到List中System.out.println(result);}
}
遍历操作:forEach()

forEach()方法用于遍历Stream中的元素。

public class ForEachExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);numbers.stream().forEach(System.out::println);  // 打印每个数字}
}
聚合操作:reduce()

reduce()方法用于将Stream中的元素按照某种方式进行聚合,常用于求和、求最大值等操作。

public class ReduceExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);Optional<Integer> sum = numbers.stream().reduce((a, b) -> a + b);  // 求和sum.ifPresent(System.out::println);  // 输出结果}
}
计数操作:count()

count()方法用于统计Stream中元素的数量。

public class CountExample {public static void main(String[] args) {List<String> list = Arrays.asList("apple", "banana", "cherry", "date");long count = list.stream().filter(s -> s.startsWith("a")).count();  // 统计以字母"a"开头的元素个数System.out.println(count);}
}

4. 并行流(Parallel Stream)

Stream API还支持并行处理数据,通过并行流可以加速大规模数据的处理。使用parallelStream()方法可以将Stream转为并行流。

public class ParallelStreamExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);numbers.parallelStream().forEach(n -> System.out.println(Thread.currentThread().getName() + ": " + n));}
}

5. 组合Stream操作

Stream的强大之处在于我们可以将多个操作组合起来,形成一个流水线式的处理流。

public class CombinedOperationsExample {public static void main(String[] args) {List<String> list = Arrays.asList("apple", "banana", "cherry", "date");list.stream().filter(s -> s.length() > 5)  // 过滤长度大于5的字符串.map(String::toUpperCase)  // 转换为大写.sorted()  // 排序.forEach(System.out::println);  // 打印结果}
}

总结

Java Stream API为集合操作提供了一个简洁且功能强大的解决方案。通过使用Stream API,我们能够:

  1. 以声明式的方式处理集合数据,提高代码的可读性。
  2. 支持函数式编程和链式操作,使代码更简洁。
  3. 实现高效的并行处理,提升性能。

Stream API不仅使得代码更加简洁,而且让我们能够利用现代多核处理器的优势,显著提高程序处理大数据的效率。在实际项目中,掌握Stream API将有助于提高代码质量和开发效率。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

http://www.xdnf.cn/news/17499.html

相关文章:

  • 微雪电子发布工业级ESP32-S3-POE工控板:8路隔离IO,双核240MHz赋能AIoT,一根网线解决供电与通信,工业物联网迎来高性价比控制新选择
  • 关键点检测(10)——yolov8-pose 复现coco-pose
  • 【QT】QMainWindow:打造专业级桌面应用的基石
  • Python基础教程(七)匹配模式:隐藏在结构之美中的编程革命
  • 实用Shell高级视频课程
  • 【CVPR2025】计算机视觉|PX:让模型训练“事半功倍”!
  • Uipath Studio中邮件自动化
  • 微信小程序中实现表单自动填充功能的方法
  • ABP VNext + Apache Kafka Exactly-Once 语义:金融级消息一致性实战
  • 在Docker中下载RabbitMQ(详细讲解参数)
  • 需求管理流程规范
  • Java-file类
  • Mybatis学习之自定义映射resultMap(七)
  • STM32CubeMX(十三)FatFs文件系统(SPI驱动W25Qxx)
  • BGP 笔记
  • 配送算法10 Batching and Matching for Food Delivery in Dynamic Road Networks
  • .NET程序跨平台ARM电脑上发布的程序格式是,so还是DLL?
  • stm32项目(24)——基于STM32的汽车CAN通信系统
  • 费米问题:估算北京有多少量特斯拉汽车?
  • 等保测评-RabbitMQ中间件
  • 【线性代数】目录
  • day 16 stm32 IIC
  • STM32——时钟系统
  • WinForm 中 ListView 控件的实战应用与功能拓展
  • Bee 2.5.2.6 发布
  • 库函数蜂鸣器的使用(STC8)
  • Typora上传图片保存到assets目录下
  • 线程池多反应堆服务器webserver(c++)
  • Web文件上传:本地与云存储实战
  • 数据分析框架从 “工具堆砌” 转向 “智能协同”