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

这是最近比较有趣的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,也可以将大量API与Jav​​a 8更好地集成在一起!

以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

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

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

相关文章

struts+swfupload实现批量图片上传(上):swfupload

custom_settings : {progressTarget : "fsUploadProgress",cancelButtonId : "btnCancel",uploadButtonId : "btnUpload",myFileListTarget : "idFileList" },custom_settings调用方法 this.customSettings.cancelButtonId 缩略图js …

40行中的持久性KeyValue Server和一个可悲的事实

再次出现。. 回顾 Peters关于Unsafe用法的书面概述 &#xff0c;我将简要介绍一下Java中的低级技术如何通过启用更高级别的抽象或允许Java性能级别来节省开发工作可能很多人都不知道。 我的主要观点是表明&#xff0c;将对象转换为字节&#xff0c;反之亦然是一个重要的基础&a…

cookie 和session 的区别

session是保存在服务器端的&#xff0c;cookie是保存在客户端的。 二者的定义&#xff1a; 当你在浏览网站的时候&#xff0c;WEB 服务器会先送一小小资料放在你的计算机上&#xff0c;Cookie 会帮你在网站上所打的文字或是一些选择&#xff0c;都纪录下来。当下次你再光临同一…

javascript - dom

动态设置事件&#xff1a; 1. <input type"button" value"val1" οnclick"fn1();"/>; 2. ie支持 attachEventw3c标准 addEventListenerif (!window.event) {document.getElementById("btn").addEventListener("click…

ajax提交手机号去数据库验证并返回状态值

<script type"text/javascript">$(function(){$(.agree_regi).click(function(){var phone $.trim($("#phone").val());if(phone ""){NewAlert(2,"请输入手机号",null);return false;}else{var reg /^0?1[3|4|5|8|7][0-9]\d…

在同一台机器上启动多个JBoss A-MQ JVM

因此&#xff0c;我最近没有写过博客-只是很忙。 但是&#xff0c;我新年的决心是写一些博客&#xff0c;分享一些我经常遇到的事情&#xff0c;即使这些简单的事情可能会帮助一些人。 因此&#xff0c;对于本条目&#xff0c;我将展示一种在单台机器上启动多个JBoss A-MQ实例…

TreeMap源码分析——深入分析(基于JDK1.6)

TreeMap有Values、EntrySet、KeySet、PrivateEntryIterator、EntryIterator、ValueIterator、KeyIterator、DescendingKeyIterator、NavigableSubMap、AscendingSubMap、DescendingSubMap、SubMap、Entry共十三个内部类。Entry是在TreeMap中用于表示树的节点的内部类&#xff0…

使用Curator和ZooKeeper发现Hazelcast成员

在一个项目中&#xff0c;我正在私有云中设置Hazelcast集群。 在群集内&#xff0c;所有节点都必须互相看见&#xff0c;因此在引导过程中&#xff0c;Hazelcast将尝试查找其他群集成员。 没有服务器&#xff0c;并且所有节点都相等。 在Hazelcast中实现了多种发现成员的技术。…

Work Queue based multi-threading

http://www.codeproject.com/Articles/8886/Work-Queue-based-multi-threading转载于:https://www.cnblogs.com/hongjiumu/archive/2013/01/06/2846946.html

功能介面

目录 1.简介 2.理由 3. Lambda表达式 4.谓词<T> 5. BiPredicate <T&#xff0c;U> 6.函数<T&#xff0c;R> 7. BiFunction <T&#xff0c;U&#xff0c;R> 8.消费者<T> 9. BiConsumer <T&#xff0c;U> 10.供应商<T> 11.一元运算符&…

WMI 使用教程_.NET 入门教程

WMI 使用教程_.NET 入门教程 先介绍一下WMI 相关知识: 什么是WMI 呢&#xff1f; Windows 管理规范 (Windows Management Instrumentation ),它的主要功 能包括:访问本地主机的一些信息和服务,可以远程管理计算机(当然你必须拥有足够的权限) 也就是说可以象重起,关机,关闭进程,…

h5输入框提示语 正常文本框提示语

<input id"username" name"username" type"text" placeholder" 请输入用户名/手机号" value"" style"width:100%;height:32px;border-style:none "/> placeholder" 请输入用户名/手机号"&…

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

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

jquery css事件编程 尺寸设置

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns"http://www.w3.org/1999/xhtml"><head><title>jquery css事件编程 尺寸设…

Python2.6 Cx_Oracle Linux下编译安装

分类&#xff1a; python Oracle 2012-06-07 00:04 239人阅读 评论(0) 收藏 举报(一) Python 2.6 安装 1.下载Python2.6.X 版本的源码包&#xff0c;这里采用平台编译安装。 Python-2.6.4.tar.bz2 2.解压缩 ,使用J参数解压bigz2类型的压缩文件 tar -jxvf Python-2.6.4.tar.bz2…

Apache TomEE(和Tomcat)的自签名证书

可能在大多数Java EE项目中&#xff0c;您将拥有具有SSL支持&#xff08; https &#xff09;的部分或整个系统&#xff0c;因此浏览器和服务器可以通过安全连接进行通信。 这意味着在处理数据之前&#xff0c;已发送的数据已加密&#xff0c;传输并最终解密。 问题在于&…

WEB效能测试和负载测试部分截图

效能测试&#xff1a; 负载测试&#xff1a; 转载于:https://www.cnblogs.com/DOOM-scse/archive/2013/01/07/2849110.html

Java8 Lambdas:解释性能缺陷的排序

与Peter Lawrey合作撰写 。 几天前&#xff0c;我对使用新的Java8声明式的排序性能提出了严重的问题。 在这里查看博客文章。 在那篇文章中&#xff0c;我仅指出了问题所在&#xff0c;但在这篇文章中&#xff0c;我将更深入地了解和解释问题的原因。 这将通过使用声明式样式重…

jquery子元素选择器

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns"http://www.w3.org/1999/xhtml"><head><title>子元素选择器</title>…

Asp.net MVC3.0 基于不同的角色显示不同的菜单

前面提到过用Asp.net MVC3.0正在做一个问答系统性质的论坛。前期把菜单全部显示以方便测试模块功能。现在正在完善&#xff0c;加上角色模块&#xff0c;然后不同的角色登陆系统会看到不同的菜单栏&#xff0c;还有就是游客&#xff08;未登录用户&#xff09;看到的菜单栏。网…