通过流而不是列表

开幕式免责声明:这并不总是一个好主意。 我将介绍这个主意,以及为什么它是一个好主意的一些原因,但随后我将讨论一些不太理想的实例。

懒惰

如您所知,我在Python中涉猎的程度几乎与在Java中一样。 我一发现Python就很喜欢生成器。 它们允许对集合进行延迟操作,因此您可以传递迭代器/生成器,直到最终真正需要这些操作的最终结果–而不影响原始集合(在大多数情况下;但您不太可能意外影响它)。

我真的很喜欢这个主意。 懒惰使得您几乎不需要做任何工作,直到需要结果为止,而且还可以做到这一点,因此不会有无用的内存来存储中间集合。

懒于Java

Java也有迭代器,但没有生成器。 但是,对于集合的惰性操作,它确实具有与之相当相似的功能: Stream 。 尽管不像Python中的生成器那样通用,但Stream基本上可以以相同的方式使用。

绕过溪流

在很多情况下,您应该返回Stream而不是返回的List (或其他集合)。 这不仅为您提供了一些懒惰的好处,还为您提供了帮助。

如果返回对象的接收者希望将其collect()放入您计划返回的List之外的其他东西,或者他们想以一种您从未料过的方式来reduce()它,则可以给他们提供Stream而不必担心。 然后,他们可以通过一两个Stream方法调用来获得所需的内容。

对此有什么不好

Stream像集合一样传递时,存在一个很难解决的问题:它们是一次性使用的。 这意味着,如果下面的一个函数想要使用Stream而不是List ,那么它就不容易做到,因为它需要使用List分别做两件事。

public static List normalize(List input) {int total = input.stream().mapToInt(i -> i).sum();return input.stream().map(i -> i * 100 / total).collect(Collectors.toList());
}

为了接收Stream ,您需要collect()它,然后在其上运行两个操作。

public static Stream normalize(Stream input) {List inputList = input.collect(Collectors.toList());int total = inputList.stream().mapToInt(i -> i).sum();return inputList.stream().map(i -> i * 100 / total);
}

这稍微违反了传递Stream的目的。 这并不可怕,因为我们正在尝试使用Stream的“最终”结果。 除了不是最终结果。 这是中间结果,用于计算下一个Stream输出。 它创建了浪费内存的中间集合。

围绕此问题有很多方法,类似于“文章”的解决方法,但是它们要么实现起来很复杂,要么容易出现用户错误。 我想只使用我向您展示的第二种方法是可以的,因为与第一种方法相比,它仍可能会获得相当不错的性能提升,但它给我带来了麻烦。

有趣(但可能有点傻)的选择

如果您熟悉我的文章,您可能会觉得本文与我前段时间写的有关使用decorator转换集合的文章背道而驰 。 从技术上讲,这篇文章确实认为这是一个相当幼稚的想法,特别是因为该想法是受Stream启发的。 但是,与本文中介绍的Stream的想法相比,装饰器的想法有一个主要好处:您可以一次又一次地遍历装饰的集合。 它的效率可能不如Stream ,特别是因为我不确定如何并行化它,但是它肯定具有重用性。

我有机会再次探讨这个想法,看看是否可以找到一种更好的方法来实现,但是我对此表示怀疑。

奥托罗

所以,那是我的主意。 您可以选择接受或保留它。 我不确定这在典型项目中有用的频率,但是我想我将在我当前和将来的项目中尝试一下。 谢谢阅读。 如果您对此有意见,请在下面评论,并让我知道。

翻译自: https://www.javacodegeeks.com/2015/02/pass-streams-instead-of-lists.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360751.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react-infinite-scroll-component 第二次加载无法触发next

react-infinite-scroll-component 是一款滚动加载插件,在页面滚动的时候加载数据,在使用过程遇到一个坑。 坑的描述: 在页面滚动的时候,infiniteScroll页面数是自动1,打个比方说,页面加载到第三页,infinit…

linux查看文件大小和查看磁盘使用情况

1、df -h 显示目前所有文件系统的可利用空间及和使用情况。参数 -h表示人类可以看懂的格式输出 2、du -h --max-depth1 目录 查询指定文件夹下各个文件夹或文件的大小 3、du -sh test/ 或 du -sm * |sort -n 查看文件目录的大小和数量,并且可以按大小排序 du和df的…

abaqus单位_ANSYS和ABAQUS哪个好,一个例子告诉你

分别用ANSYS和ABAQUS来分析同一个题目并考察其异同点。【问题】一根悬臂梁,长200mm,截面是30mm*20mm的矩形(高度方向是20mm)。该梁左端固定,在其上面施加向下的分布力系,载荷集度是0.6Mpa.已知材料使用低碳钢,弹性模量是200GPA&am…

electron nodejs上传文件获取文件流

使用antd upload组件,electron中ipcRenderer.invoke无法传递文件流; 传文件路径过去,然后使用nodejs获取文件流 // 创建数据流const readerStream fs.createReadStream(path)const formData new FormData()formData.append("file_name…

使用junit做其他事情

junit!单元测试 Junit是Java单元测试框架。 通常,我们将其用于单元测试,但是很多时候我们也使用它来执行集成测试。 主要区别在于,单元测试可测试单个单元,而集成测试则可测试不同类如何协同工作。 这样,集…

转行python能拿到多少钱_想转行学python过来人提醒大家几点

因为目前python非常火,应用也非常广泛,是目前最火的行业之一,竞争很大,工资很高,未来发展也极好。Python 现在到底有多热呢?我觉得我们可以看以下的这2组数据。第一:Python 排名稳居前五得益于 …

纯前端 导出excel 插件xlsx和file-saver

使用插件 xlsx 导出表格,file-saver保存文件 vue-element-admin,源码中找的;导出上万条数据还是很快的 gitHub地址,/vendor/Export2Excel的js文件 使用方法 export_json_to_excel({header: res.header,data: res.exportData,filename: ${fileName}1-$…

用Java创建自己的AOP

介绍 如您所知,AOP是Spring框架提供的最好的功能之一,它在实现跨领域关注的同时提供了最大的灵活性。 您是否想到过AOP在Spring如何工作? 有时这是高级技术面试时要问的问题。 有时,仅涉及核心Java时,这个问题变得更加…

linux中常用的头文件

#include <linux/***.h> 是在linux-2.6.29/include/linux下面寻找源文件。 #include <asm/***.h> 是在linux-2.6.29/arch/arm/include/asm下面寻找源文件。 #include <mach/***.h> 是在linux-2.6.29/arch/arm/mach-s3c2410/include/mach下面寻找源文件。 #in…

java的文本框如何回车键触发按钮_java回车触发按钮的代码

使用的时候&#xff0c;只要将SwingUtils .enterPressesWhenFocused(JButton)这样就可以实现回车时候&#xff0c;触发按钮。另外文本输入框回车触发事件则是&#xff1a;SwingUtils .enterPressesWhenFocused(JTextField textField,ActionListener actionListener) 。其中acti…

Typescript Interface 覆盖继承的接口定义

type Merge<M, N> Omit<M, Extract<keyof M, keyof N>> & N;使用方式 interface A {name: string;color?: string; } type B Merge<A, {name: string | number;favorite?: boolean; }>;参考地址

JBoss Fuse –一些鲜为人知的技巧

TL; DR 将Java静态调用公开为Karaf Shell本机命令 在部署时覆盖OSGi标头 在使用OSGi片段部署时间后覆盖OSGi标头 将Java静态调用公开为Karaf Shell本机命令 作为必须与支持人员和客户进行协作的软件工程师的一部分&#xff0c;我经常发现自己需要从无法访问的系统中提取其他…

cocos2d-x学习笔记之图片分辨率适配

从wiki里面看到&#xff0c;新的版本是去掉了enabelRetinaDisplay&#xff0c;因为要兼容iosandroid&#xff0c;其他平台是否也是如此&#xff0c;未知&#xff5e; 测试代码 std::vector<std::string> resDirOrders; resDirOrders.push_back("testImage2"…

vue 外部方法调用内部_vue函数内部调用外部函数,报错外部函数不是函数

zeroFill (num,len,radix) {let str num.toString(radix || 10);while (str.length < len) {str 0 str;}return str;},initMap() {console.log(this.zeroFill(50, 8, 16))//底图图层数据源var googleDXSource new XYZ({tileUrlFunction: function (coor) {console.log(c…

electron+react 用户自定义安装路径

使用electron-builder打包electron项目&#xff0c;其中Windows提供了NSIS来自定义安装程序。 在主进程的package.json文件中添加一些配置 "scripts":{},"build": {"directories": {"output": "release"},"nsis":…

模型微调入门介绍一

备注&#xff1a;模型微调系列的博客部分内容来源于极客时间大模型微调训练营素材&#xff0c;撰写模型微调一系列博客&#xff0c;主要是期望把训练营的内容内化成自己的知识&#xff0c;我自己写的这一系列博客除了采纳部分训练营的内容外&#xff0c;还会扩展细化某些具体细…

JMH:如何设置和运行JMH基准

健康警告&#xff01; 这篇文章描述了如何设置和运行简单的JMH基准测试。 众所周知&#xff0c;微基准测试很难正确设置&#xff0c;即使您确实正确设置了&#xff08;通过使用JMH之类的工具&#xff09;&#xff0c;它们仍然会产生误导。 仅仅因为您的代码在极端孤立的人为情况…

npp夜光数据介绍 viirs_科研成果快报第177期:中国地区长时序AVHRR气溶胶数据的主要问题: 气溶胶反演频次与重污染天气...

中国地区长时序AVHRR气溶胶数据的主要问题&#xff1a;气溶胶反演频次与重污染天气A critical view of long-term AVHRR aerosol data record in China: Retrieval frequency and heavy pollution成果信息Minghui Tao, Rong Li, Lili Wang et al. (2020)A critical view of lon…

使用Eclipse创建一个Android程序方法

要编写Android程序&#xff0c;需要安装JDK、Eclipse和Android SDK。 Android SDK的安装路径不要在program file或program file(x86)下&#xff0c;否则在debug时会碰很奇怪的问题。最好直接放在C:\Android下。&#xff08;如果非要放在Program files下也可以&#xff0c;在ecl…

ahooks useVirtualList 滚动条抖动或者数据抖动

原因 页面内容高度发生变化引起滚动条跳动的问题。浏览器会自动触发onscroll事件&#xff0c;调整滚动条的位置&#xff0c;让滚动条不乱跳动 ; 懒加载的时候由于不断更新列表项内部的高度&#xff0c;因此就会使浏览器自动触发滚动事件&#xff0c;而滚动事件又触发懒加载的更…