列表流和feed流_通过流而不是列表

列表流和feed流

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

懒惰

如您所知,我在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

列表流和feed流

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

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

相关文章

mysql数据导出不完正_【MySQL】mysqldump 导出数据 常见问题

1、使用mysqldump时报错(1064),这个是因为mysqldump版本太低与当前数据库版本不一致导致的mysqldump: Couldnt execute SET OPTION SQL_QUOTE_SHOW_CREATE1: You have an error in your SQL syntax; check the manual thatcorresponds to your MySQL server version…

C语言Main函数到底有几种,你真的懂吗?

乍一看标题,感觉小编小题大做,但凡学过C语言的聚聚,都知道C程序入口就是main函数,且一套程序里面有且仅有一个。但是很多时候我们看到的main函数却并不是千篇一律,格式竟然会有差别,这究竟是为啥&#xff1…

java泛型类指定多个泛型_Java泛型中的多态

java泛型类指定多个泛型从作为Java程序员的早期开始,我们都知道如何实例化和使用Collection对象。 实例化为具体类的List接口将如下所示。 List myArrayList new ArrayList();如果myArrayList应该仅保存Integer对象,则从Java 5编译器开始&#xff0c…

python大型项目经验_图像分类:13个Kaggle项目的经验总结

来源:数据派THU任何领域的成功都可以归结为一套小规则和基本原则,当它们结合在一起时会产生伟大的结果。机器学习和图像分类也不例外,工程师们可以通过参加像Kaggle这样的竞赛来展示最佳实践。在这篇文章中,我将给你很多资源来学习…

C语言程序main入口函数

一.main()函数是什么样的我们先要搞清楚main()函数有哪几种?查阅C89/C99/C11标准文档,里面明确固定了两种写法:int main(void) { /* ... */ }int main(int argc, char *argv[]) { /* ... */ }除此之外,其他写法应该都是不规范的写…

spring可用于数据层吗_Spring XD用于数据提取

spring可用于数据层吗Spring XD是一个功能强大的工具,它是一组可安装的Spring Boot服务,可以独立运行,在YARN或EC2之上运行。 Spring XD还包括一个管理UI网站和一个用于作业和流管理的命令行工具。 Spring XD是一组功能强大的服务&#xff0c…

go语言mysql操作_使用Go语言操作MySQL数据库的思路与步骤

最近在做注册登录服务时,学习用Go语言操作MySQL数据库实现用户数据的增删改查,现将个人学习心得总结如下,另外附有代码仓库地址,欢迎各位有兴趣的fork。软件环境:Goland、Navicat for MySQL。一、实现思路1&#xff0c…

学习嵌入式C语言的6个层级,你在哪一层?

C语言可以说是一种经典的编程语言,没有C语言就没有今天的各种操作系统。C语言是基础,那么你掌握了多少?新手级别学习目的:过计算机二级,考证,应付期末考试。需要掌握的程度:掌握C语言的基本语法…

intellij idea_IntelliJ IDEA内部设计

intellij ideaIntelliJ IDEA的第一个版本于2001年1月发布,当时它是第一个集成了高级代码导航和代码重构功能的Java IDE之一。 2009年,JetBrains开源了其社区版本 。 从那时起,创建了许多基于它的IDE,例如Google的Android Studio。…

mysql索引下沉_MySQL 5.6 索引条件下推优化

索引下推优化是MySQL5.6版本中新加的功能。索引条件下推(ICP)是对MySQL使用索引从表中检索行的情况的优化。如果没有ICP,存储引擎会遍历索引以查找基表中的行,并将它们返回给MySQL服务器,由server层再做一波筛选。启用ICP后,如果只…

C语言 | 函数执行成功时,return 1 还是return 0?

今天分享的内容是关于函数执行成功,返回0还是1的讨论~基本上,没有人会将大段的C语言代码全部塞入 main() 函数,更好的做法是按照复用率高,耦合性低的原则,尽可能的将代码拆分不同的功能模块,并封装成函数。…

jcache_窥探JCache API(JSR 107)

jcache这篇文章从较高的层次介绍了JCache API,并提供了一个预告片–仅够您(希望)开始对此发痒了;-) 在这篇文章中……。 JCache概述 JCache API,实现 JCache API支持的(Java)平台 快速了解O…

redis 启动加载mysql_Redis分析系列:启动加载过程

从本篇文章开始(命名为Redis分析系列),将会通过分析Redis的源代码(以Redis 2.2.0 RC1为准),来对它的内部实现做一些探讨。本文主要介绍Redis启动加载过程,总体上可以分为如下几步:1. 初始化全局服务器配置2. 加载配置文件(如果指定…

c 文件怎么进行读取和写入操作?

C >>和<<读写文本文件&#xff1a;fstream 或者 ifstream 类负责实现对文件的读取&#xff0c;它们内部都对 >> 输出流运算符做了重载&#xff1b;同样&#xff0c;fstream 和 ofstream 类负责实现对文件的写入&#xff0c;它们的内部也都对 << 输出流…

mysql+误操作怎么恢复_Mysql误操作恢复流程

一、开启binlog。show variables like log_bin;#vim /etc/my.cnf在[mysqld]中加入log-bin mysql-binlog-bin /usr/local/mysql/log/mysql-bin.log重启mysql服务#service mysqld stop#service mysqld start二、数据写入建库create database …

drools6.5_Drools 6.2.0.Final发布

drools6.5我们很高兴地宣布最新&#xff0c;最出色的Drools 6.2.0.Final版本。 特别是此发行版更加注重改进的可用性和功能&#xff0c;这些功能使项目更易于使用&#xff08;和采用&#xff09;。 新功能包括对工作台UI的大量改进&#xff0c;对社交活动和插件管理的支持以及…

c程序编写x的y次方的方法

c程序怎么编写x的y次方?C语言pow()函数&#xff1a;求x的y次方&#xff08;次幂&#xff09;头文件&#xff1a;#include pow() 函数用来求 x 的 y 次幂&#xff08;次方&#xff09;&#xff0c;其原型为&#xff1a;double pow(double x, double y);pow()用来计算以x 为底的…

python redis pipeline使用方法_python使用pipeline批量读写redis的方法

用了很久的redis了。随着业务的要求越来越高。对redis的读写速度要求也越来越高。正好最近有个需求(需要在秒级取值1000的数据)&#xff0c;如果对于传统的单词取值&#xff0c;循环取值&#xff0c;消耗实在是大&#xff0c;有小伙伴可能考虑到多线程&#xff0c;但这并不是最…

jboss fuse 教程_JBoss Fuse –一些鲜为人知的技巧

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

8条嵌入式C语言编程小知识总结

1. 流水线被指令填满时才能发挥最大效能&#xff0c;即每时钟周期完成一条指令的执行(仅指单周期指令)。如果程序发生跳转&#xff0c;流水线会被清空&#xff0c;这将需要几个时钟才能使流水线再次填满。因此&#xff0c;尽量少的使用跳转指令可以提高程序执行效率&#xff0c…