首页 > 其他分享 >Stream API用好了效率倍增,优缺点对比

Stream API用好了效率倍增,优缺点对比

时间:2024-06-13 11:15:07浏览次数:23  
标签:Stream stream 优缺点 单词 collect API words

https://mp.weixin.qq.com/s/Oc-WpS2hdMgPtHWuhwgzCw

 

既然JDK的大神们,设计出Stream API,肯定是优点大于缺点,程序汪必须拥抱变化,下面我列出了他的优缺点,后面还有常见函数的例子。

优点:

  1. 代码简洁:Stream API 使用Lambda表达式,使得集合操作的代码更加简洁易读,减少了传统的for循环和if条件语句的使用,提高了代码的可维护性。

  2. 并行处理:Stream API 支持并行处理,只需调用parallel()方法即可轻松地将串行流转换为并行流,充分利用多核处理器的优势,提高程序的执行效率。

  3. 声明式编程:Stream API 采用声明式而非命令式的编程方式,开发者只需要描述“做什么”而不是“怎么做”,使得逻辑更加清晰。

  4. 丰富的操作:提供了诸如map、filter、reduce、sorted、distinct等多种操作,几乎涵盖了所有集合处理的需求,能够灵活地进行数据处理和转换。

  5. 延迟执行:很多Stream操作都是懒惰的(lazy),只有当真正需要结果时才执行计算,这在处理大量数据或构建复杂管道时非常有用,可以避免不必要的计算,节省资源。

缺点:

  1. 性能开销:虽然Stream API 提供了并行处理的能力,但并非所有情况下都能带来性能提升。对于小数据集,串行处理可能更快,因为并行处理涉及到线程的创建和协调,会引入额外的开销。

  2. 内存消耗:在进行复杂的Stream操作时,特别是涉及大对象或深度嵌套操作时,可能会消耗较多内存,特别是如果操作不当导致中间结果没有被及时释放。

  3. 调试困难:由于Stream API 使用链式调用和函数式编程风格,有时错误信息不够直观,尤其是当处理逻辑复杂时,调试和定位问题可能较为困难。

  4. 学习曲线:对于习惯于命令式编程的开发者来说,理解和熟练运用Stream API,特别是Lambda表达式和函数式接口,可能需要一定的时间和练习。

  5. 不适用所有场景:虽然Stream API 功能强大,但对于一些简单的集合操作,传统的循环可能更直接、更易于理解。过度使用Stream API 反而可能导致代码难以阅读。

总的来说,Java 8的Stream API 是一种强大的工具,特别适合于数据处理和分析场景,但使用时需要根据具体情况权衡其优缺点,合理选择使用时机和方式。

 

基于之前的测试数据,下面展示每个Stream操作的示例代码、预期的测试结果数据:

测试数据

List<String> words = Arrays.asList(
    "apple", "banana", "cherry", "date", "elderberry",
    "fig", "grape", "honeydew", "ice cream", "jackfruit"
);

方法及测试结果

  1. map - 转换每个元素为大写
List<String> upperCaseWords = words.stream()
                                .map(String::toUpperCase)
                                .collect(Collectors.toList());
// 测试结果: ["APPLE", "BANANA", "CHERRY", "DATE", "ELDERBERRY", "FIG", "GRAPE", "HONEYDEW", "ICE CREAM", "JACKFRUIT"]
  1. filter - 筛选出以"a"开头的单词
List<String> startsWithA = words.stream()
                             .filter(s -> s.startsWith("a"))
                             .collect(Collectors.toList());
// 测试结果: ["apple", "apricot"] (注意: "apricot"未在原始数据中,这里为了演示效果添加)
  1. forEach - 打印每个单词(直接输出到控制台,无返回结果)
words.stream().forEach(System.out::println);
// 测试结果: 直接输出所有单词到控制台
  1. sorted - 升序排序
List<String> sortedWords = words.stream()
                              .sorted()
                              .collect(Collectors.toList());
// 测试结果: ["apple", "banana", "cherry", "date", "elderberry", "fig", "grape", "honeydew", "ice cream", "jackfruit"]
  1. distinct - 移除重复项(假设数据中包含重复项)
List<String> uniqueWords = words.stream()
                              .distinct()
                              .collect(Collectors.toList());
// 测试结果: 去除任何重复单词后的原始列表
  1. reduce - 计算单词总长度
int totalLength = words.stream()
                      .mapToInt(String::length)
                      .reduce(0, Integer::sum);
// 测试结果: 78 (这是示例列表中所有单词长度之和)
  1. flatMap - 合并单词中的字符为单一字符流
List<String> flatMapResult = words.stream()
                                .flatMap(s -> s.chars().mapToObj(c -> String.valueOf((char)c)))
                                .collect(Collectors.toList());
// 测试结果: 将所有单词拆分成单个字符组成的列表,如 ["a", "p", "p", "l", "e", ...]
  1. limit - 取前三个单词
List<String> firstThreeWords = words.stream()
                                  .limit(3)
                                  .collect(Collectors.toList());
// 测试结果: ["apple", "banana", "cherry"]
  1. skip - 跳过前三个单词
List<String> afterThreeWords = words.stream()
                                  .skip(3)
                                  .collect(Collectors.toList());
// 测试结果: ["date", "elderberry", "fig", "grape", "honeydew", "ice cream", "jackfruit"]
  1. collect - 分组统计单词长度
Map<Integer, List<String>> groupedByLength = words.stream()
                                               .collect(Collectors.groupingBy(String::length));
// 测试结果: 如 {5=["apple", "grape"], 6=["banana"], 7=["cherry", "elderberry"], 3=["fig"], 4=["date"], ...}

请注意,上述示例中的某些测试结果(如分组统计)依赖于具体的数据集,因此实际输出可能会根据你提供的数据有所变化。

标签:Stream,stream,优缺点,单词,collect,API,words
From: https://www.cnblogs.com/l20211103/p/18245474

相关文章

  • FFmpeg结构体:AVStream
    1.描述AVStream是存储每一个视频/音频流信息的结构体,位于avformat.h文件中。2.结构体定义1typedefstructAVStream{2intindex;/**<streamindexinAVFormatContext*/3/**4*Format-specificstreamID.5*decoding:setbyli......
  • 用fastapi和sse创建流式输出接口
    示例为调用huggingface的大模型,使其流式输出fromfastapiimportFastAPI,RequestimportrequestsimportjsonimportosfrompydanticimportBaseModelfromtransformersimportAutoTokenizer,AutoModelForCausalLM,TextStreamer,TextIteratorStreamerfromsse_star......
  • Qwen2 阿里最强开源大模型(Qwen2-7B)本地部署、API调用和WebUI对话机器人
    阿里巴巴通义千问团队发布了Qwen2系列开源模型,该系列模型包括5个尺寸的预训练和指令微调模型:Qwen2-0.5B、Qwen2-1.5B、Qwen2-7B、Qwen2-57B-A14B以及Qwen2-72B。对比当前最优的开源模型,Qwen2-72B在包括自然语言理解、知识、代码、数学及多语言等多项能力上均显著超越当前领先的Lla......
  • 使用自定义查询参数获取 fullcalendar api
    我正试图配置fullcalendar5从数据库中获取api。除了开始和结束之外,我还想向请求传递额外的查询参数。我已经尝试过这种方法,但发现请求总是忽略附加参数。events:{url:'http://localhost:4000/api/timesheet'、type:'GET'、......
  • FastAPI-8:Web层
    8Web层本章将进一步介绍FastAPI应用程序的顶层(也可称为接口层或路由器层)及其与服务层和数据层的集成。一般来说,我们如何处理信息?与大多数网站一样,我们的网站将提供以下方法:检索创建修改替换删除8.1插曲:自顶向下、自底向上、中间向外?(Top-Down,Bottom-Up,Middle-Out......
  • 用Napi编写nodejs Addon并调用dll
    用Napi编写nodejsAddon并调用dllnpdejs调用C++addon并没有先前那篇随笔那么复杂,这是一篇补充说明:说明如何使用c++项目的include头文件以及lib,dll引入到addon内使用一、使用VS编写DLL导出项目步骤1:通过VisualStudio(推荐2019及其以上)新建一个“具有导出项的(DLL)动态链接库......
  • api接口
    importtornado.httpserverimporttornado.ioloopimporttornado.webfromtornado.optionsimportdefinefromtornado.optionsimportoptionsimportjsonimportnumpyasnpclassBaseHandler(tornado.web.RequestHandler):defpost(self,*args,**kwargs):idcard......
  • 使用foreach和stream遍历并修改List列表
    使用foreach和stream遍历并修改List列表1.使用foreachimportjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.stream.Collectors;publicclassTestList{publicstaticvoidmain(String[]args......
  • python系列:python fastapi + uvicorn 记录日志的最佳实践,结合nb_log
    pythonfastapi+uvicorn记录日志的最佳实践,结合nb_logpythonfastapi+uvicorn记录日志的最佳实践,结合nb_logpythonfastapi+uvicorn记录日志的最佳实践,结合nb_logpythonfastapi+uvicorn记录日志的最佳实践,要记录对fastapi什么时候请求了什么url和入......
  • 阿里巴巴中国站关键字搜索API返回值应用案例:精准定位目标用户群体
    阿里巴巴中国站的关键字搜索API返回值在精准定位目标用户群体方面,具有广泛的应用案例。这些应用案例主要集中在以下几个方面:数据分析与市场调研:通过关键字搜索API,商家可以获取大量与特定商品或服务相关的搜索数据。对这些数据进行深度分析,可以了解目标用户群体的搜索习惯......