java iterable_太糟糕了,Java 8没有Iterable.stream()

java iterable

这是最近比较有趣的Stack Overflow问题之一:

为什么Iterable不提供stream()和parallelStream()方法?

最初,直接将Iterable转换为Stream似乎很直观,因为在90%的用例中,两者实际上或多或少是同一件事。

诚然,专家组非常注重使Stream API具有并行功能,但是每天使用Java的任何人都会立即注意到, Stream以其顺序形式最有用 。 而Iterable就是这样。 不保证并行化的顺序流。 因此,只有我们可以简单地编写以下内容,这才是直观的:

iterable.stream();

实际上, IterableIterable确实具有此类方法,例如

collection.stream();

Brian Goetz亲自回答了上述Stack Overflow问题 。 省略的原因是由于某些Iterables可能更喜欢返回IntStream而不是Stream 。 这似乎确实是做出设计决策的一个非常遥远的原因,但是与往常一样,今天的省略并不意味着永远的省略。 另一方面,如果他们今天引入了Iterable.stream() ,但事实证明这是一个错误,他们将无法再次将其删除。

好吧,Java中的原始类型很痛苦,它们首先对泛型造成了种种不良影响,现在对Stream也产生了各种不良影响,因为我们必须编写以下内容,才能将Iterable转换为Stream

Stream s = StreamSupport.stream(iterable.spliterator(), false);

Brian Goetz认为这很“容易”,但我不同意。 作为API使用者,由于以下原因,我在生产力方面遇到了很多摩擦:

  • 必须记住此否则无用的StreamSupport类型。 可以将这个方法很好地放到Stream接口中,因为我们已经有了Stream构造方法,例如Stream.of()
  • 在我认为与并行化无关的情况下,必须记住IteratorSpliterator之间的细微差别。 不过,极有可能Spliterators最终会变Spliterators流行,所以这个疑问是魔术8球需要解决的问题。
  • 实际上,我必须重复以下信息:没有任何可通过布尔参数false并行化的信息。

并行化在此新API中的作用确实很大,即使并行化仅覆盖所有功能集合操作的5%-10%。 尽管顺序处理不是JDK 8 API的主要设计目标,但确实对我们所有人都是主要的好处,与顺序处理相关的API周围的摩擦应尽可能小。

上面的方法应该刚刚被调用:

Stream s = Stream.stream(iterable);

可以这样实现:

public static<T> Stream<T> stream(Iterable<T> i) {return StreamSupport.stream(i.spliterator(), false);
}

显然,便利性重载允许进行其他特殊化,例如并行化或通过Spliterator

但是,如果Iterable具有自己的stream()默认方法,那么即使没有显式支持Java 8的情况下,与Java 8集成的API数量也将大大增加。

以jOOQ为例。 jOOQ仍然支持Java 6,因此不可能直接依赖。 但是,jOOQ的ResultQuery类型 Iterable 。 这使您可以直接在foreach循环中内联使用此类查询,就像编写PL / SQL一样:

PL / SQL

FOR book IN (SELECT * FROM books ORDER BY books.title
)
LOOP-- Do things with book
END LOOP;

Java

for (BookRecord book : ctx.selectFrom(BOOKS).orderBy(BOOKS.TITLE)
) {// Do things with book
}

现在想象一下Java 8中的同样情况:

ctx.selectFrom(BOOKS).orderBy(BOOKS.TITLE).stream().map / reduce / findAny, etc...

不幸的是,目前尚无法实现上述功能。 当然,您可以急切地将所有结果提取到jOOQ Result ,该Result扩展了List

ctx.selectFrom(BOOKS).orderBy(BOOKS.TITLE).fetch().stream().map / reduce / findAny, etc...

但是,这是另一种调用方法(每次),并且实际的流语义已被破坏,因为获取操作很忙。

高水平的抱怨

当然,这是一个高水平的抱怨,但是如果将来的Java版本(例如Java 9)将这种缺少的方法添加到Iterable API中,那将是非常不错的选择。 同样,所有用例中的99%都希望返回Stream类型,而不是IntStream类型。 并且,如果他们出于某种晦涩的原因而确实希望这样做(比起旧的旧版Java API的许多邪恶事物,晦涩得多, intStream()一下Calendar ),那么为什么他们不应该只声明一个intStream()方法呢? 毕竟,如果有人真的对int基本类型进行运算时,如果有人疯狂地编写Iterable<Integer> ,那么他们可能会接受一些解决方法。

翻译自: https://www.javacodegeeks.com/2014/12/really-too-bad-that-java-8-doesnt-have-iterable-stream.html

java iterable

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

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

相关文章

three.js加载3d模型_基于WebGL的3D技术在网页中的运用 ThingJS 前端开发

Three.js、ThingJS这些引擎库可以加载3D制作软件的模型&#xff0c;大幅度提高了制作效率&#xff0c;改变WebGL开发困难的局面&#xff0c;让Web开发者享受便捷的3D开发服务。三者的难度对比如下&#xff1a;ThingJS&#xff08;框架&#xff09;< Three.js&#xff08;引擎…

C语言 | typedef

C语言typedef用新的类型名代替原有的类型名//指定用Integer为类型名&#xff0c;作用与int相同。 typedef int Integer&#xff1b;//指定用Real为类型名&#xff0c;作用与float相同。 typedef float Real&#xff1b;C语言允许程序设计者用一个简单的名字代替复杂的类型形式命…

php珠心算源码,深度解析珠心算的“开智”功能

编者按&#xff1a;本文来自李绵军校长在廊坊智慧特训营演讲。李绵军校长通过十几年来对珠心算的钻研练习&#xff0c;详细解读了珠心算的开智功能&#xff0c;以及“一门深入”的作用。珠心算的开智价值是在哪里&#xff1f;大家都说开发智力&#xff0c;我在这讲开发智力不是…

jsr 269 api_研究Java 9 Money and Currency API(JSR 354)

jsr 269 apiJSR 354定义了一个用于处理货币和货币的新Java API&#xff0c;计划将其包含在Java 9中。在本文中&#xff0c;我们将研究参考实现的当前状态&#xff1a; JavaMoney 。 就像我关于Java 8日期/时间API的帖子一样&#xff0c;该帖子将主要由显示新API的代码驱动。 …

python程序调试题_关于python程序调试问题,一个文件计算的问题

那位大神帮小弟看下这段代码有什么需要改进的没有。程序要求为&#xff1a;程序主要内容是&#xff1a;大地坐标经纬度的格式转换问题&#xff0c;例如12030′30″转换为120.50833333&#xff0c;并且可以互换&#xff0c;这样的程序。...那位大神帮小弟看下这段代码有什么需要…

C语言 函数

定义函数在 C 语言中&#xff0c;函数由一个函数头和一个函数主体组成。下面列出一个函数的所有组成部分&#xff1a;返回类型&#xff1a;一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值&#xff0c;在这种情况下&#xff…

cassandra 入门_Apache Cassandra和Java入门(第二部分)

cassandra 入门要求 要遵循本教程&#xff0c;您应该已经有一个正在运行的Cassandra实例&#xff08; 一个小型集群会很好 &#xff0c;但不是必需的&#xff09;&#xff0c;已安装Datastax Java驱动程序&#xff08; 请参阅第I部分 &#xff09;&#xff0c;并且已经在这里进…

蓝桥杯 java 组素数,2018 蓝桥杯省赛 B 组模拟赛(五) B 结果填空:素数个数

对0,1,2,3,4,5,6,7进行全排列&#xff0c;需要注意的是0不能开头&#xff0c;所以我直接让初始值设为1,0,2,3,4,5,6,7&#xff0c;这样就避免了0开头的情况。对于每一次去判断是不是素数的话会有点浪费时间&#xff0c;所以可以用素数打表。实现代码&#xff1a;#include using…

自适应 幻灯片代码 app_字节跳动 To B 再添一员,将推出飞书文档独立App | 36氪独家...

不只是功能点的延伸&#xff0c;以 C 端打 B 端&#xff0c;是字节跳动推出“飞书文档”的另一体现。文&#xff5c;苏建勋头图来源| IC photo据36氪获悉&#xff0c;字节跳动旗下移动办公软件“飞书”将于近期推出独立 App “飞书文档”。这是继2月底&#xff0c;字节跳动推出…

听说高手都用记事本写C语言代码?

坊间传闻高手都喜欢用记事本写代码&#xff0c;那么问题来了&#xff0c;我们以C语言为例&#xff0c;如何用记事本编译运行呢&#xff1f;其实最简单的方式就是安装GCC编译器&#xff0c;在记事本编写C语言程序&#xff0c;然后再在命令行用GCC编译运行&#xff0c;下面我简单…

jface_使用JFace Viewer延迟获取模型元素

jfaceEclipse JFace Viewers显示的模型元素有时需要花费大量时间来加载。 因此&#xff0c; 工作台提供了IDeferredWorkbenchAdapter类型以在后台获取此类模型元素。 不幸的是&#xff0c;似乎仅通过DeferredTreeContentManager派生的AbstractTreeViewer支持此机制。 因此&…

php第一课,[php第一课]php简介

学习php前提&#xff1a;应有html与css知识1、php简介[1]php是一种开源通用服务器端脚本语言。[2]php&#xff1a;hypertext preprocessor&#xff0c;译名为超文本预处理器[3]在服务器上执行[4]php文件&#xff1a;{1}php文件包含文本、html、js、php代码{2}服务器上运行&…

python省略_在python中如何连接用省略号(…)分隔的连续行

您只需&#xff1a;delim ...text This is single line.This is second long line... continue from previous line.This third single line.# here were building a list containing each line# well clean up the leading and trailing whitespace# by mapping Pythons str…

C语言边角料:结构体中指针类型的成员变量,它的类型重要吗?

一、前言昨天在编译代码的时候&#xff0c;之前一直OK的一个地方&#xff0c;却突然出现了好几个 Warning!本着强迫症要消灭一切警告的做法&#xff0c;最终定位到&#xff1a;是结构体内部&#xff0c; 指向结构体类型的指针成员变量导致的问题。这个问题&#xff0c;也许永远…

oracle 11g b表空间什么情况下自动增加,Oracle 11g表空间——创建和扩展(永久)表空间...

Oracle 11g表空间——创建和扩展(永久)表空间本文内容创建(永久)表空间查看表空间扩展表空间创建(永久)表空间Oracle 按照区和段空间进行管理表空间。区管理方式 - 针对区的分配方式的不同&#xff0c;有两种方式&#xff1a;字典管理方式(dictionary-managed tablespace&#…

python rsa 公钥解密_python利用rsa库做公钥解密的方法教程

前言对于RSA的解密&#xff0c;即密文的数字的 D 次方求mod N 即可&#xff0c;即密文和自己做 D 次乘法&#xff0c;再对结果除以 N 求余数即可得到明文。D 和 N 的组合就是私钥(private key)。算法的加密和解密还是很简单的&#xff0c;可是公钥和私钥的生成算法却不是随意的…

oracle 11g release2版本jdbc,Oracle发布JDeveloper11gRelease2更新版

Oracle在周二的时候发布了JDeveloper IDE升级版JDeveloper 11g Release 2&#xff0c;该版本支持JSF 2.0技术和模块化的服务端Web UI开发&#xff1b;另外该版本在启动时间上和运行性能上也有很大改善&#xff0c;因为整个IDE重新架构了&#xff0c;基于OSGi后端结构&#xff0…

C语言:--位域和内存对齐

位域位域是指信息在保存时&#xff0c;并不需要占用一个完整的字节&#xff0c;而只需要占几个或一个二进制位。为了节省空间&#xff0c;C语言提供了一种数据结构&#xff0c;叫“位域”或“位段”。“位域“是把一个字节中的二进位划分为几个不同的区域&#xff0c;并说明每个…

python页面驱动mxd_如何利用python 批量导出mxd至jpg

展开全部你好&#xff0c;arcpy.mapping提供了如下的函32313133353236313431303231363533e78988e69d8331333335313835数&#xff1a;arcpy.mapping 函数AddLayer(data_frame, add_layer, {add_position})AddLayerToGroup(data_frame, target_group_layer, add_layer, {add_posi…

junit rule_使用@Rule在JUnit中测试文件和目录

junit rule多亏了TemporaryFolder Rule在JUnit中使用文件和目录进行测试很容易。 在JUnit中&#xff0c;规则&#xff08; Rule &#xff09;可以用作夹具设置和清除方法&#xff08; org.junit.Before &#xff0c; org.junit.After &#xff0c; org.junit.BeforeClass和org…