太糟糕了,Java 8没有Iterable.stream()
这是最近比较有趣的Stack Overflow问题之一:
为什么Iterable不提供stream()和parallelStream()方法?
最初,直接将Iterable
转换为Stream
似乎很直观,因为在90%的用例中,两者实际上或多或少是同一件事。
诚然,专家组非常注重使Stream
API具有并行功能,但是每天使用Java的任何人都会立即注意到, Stream
以其顺序形式最有用 。 而Iterable
就是这样。 不保证并行化的顺序流。 因此,只有我们可以简单地编写以下内容,这才是直观的:
iterable.stream();
实际上, Iterable
子Iterable
确实具有此类方法,例如
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()
。 - 在我认为与并行化无关的情况下,必须记住
Iterator
和Spliterator
之间的细微差别。 不过,极有可能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与Java 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
太糟糕了,Java 8没有Iterable.stream()相关推荐
- java iterable_太糟糕了,Java 8没有Iterable.stream()
java iterable 这是最近比较有趣的Stack Overflow问题之一: 为什么Iterable不提供stream()和parallelStream()方法? 最初,直接将Iterable ...
- 深入理解 Java中的 流 (Stream)
个人小站,正在持续整理中,欢迎访问:http://shitouer.cn 小站博文地址:深入理解 Java中的 流(Stream)机制 最近在看<Hadoop:The Definitive Gu ...
- java(九)-方法引用, Stream流,File类 , 递归 ,字节流
day09[方法引用.Lambda表达式.Stream流] 今日目标 线程状态 等待与唤醒 Lambda表达式 Stream流 教学目标 能够说出线程6个状态的名称 能够理解等待唤醒案例 能够掌握La ...
- Java流式编程stream
文章目录 一.简介 二.创建Stream 三.常用操作 四.其他操作 一.简介 流式 API 从 Java8 开始引入,支持链式书写. 流只能消费一次,不能被两次消费(两次最终操作) 流在管道中流通, ...
- java.io.StreamCorruptedException: invalid stream header: EFBFBDEF 问题解决
java.io.StreamCorruptedException: invalid stream header: EFBFBDEF 问题解决 参考文章: (1)java.io.StreamCorrup ...
- Java使用Optional与Stream来取代if判空逻辑(JDK8以上)
Java使用Optional与Stream来取代if判空逻辑(JDK8以上) 通过本文你可以用非常简短的代码替代业务逻辑中的判null校验,并且很容易的在出现空指针的时候进行打日志或其他操作. 注:如 ...
- Java 8系列之Stream中万能的reduce
Stream系列: Java 8系列之Stream的基本语法详解 Java 8系列之Stream的强大工具Collector Java 8系列之重构和定制收集器 Java 8系列之Stream中万能的 ...
- Java 8系列之Stream的强大工具Collector
Stream系列: Java 8系列之Stream的基本语法详解 Java 8系列之Stream的强大工具Collector Java 8系列之重构和定制收集器 Java 8系列之Stream中万能的 ...
- java.io.EOFException: Chunk stream does not exist at page: 0
http://www.cnblogs.com/kaka/archive/2012/03/15/2398215.html ActiveMQ 启动异常 在按照 <ActiveMQ in Action ...
最新文章
- 关于webpack的使用
- leetcode算法题--删除排序链表中的重复元素 II
- 15.基于Hadoop的数据仓库Hive第3部分(Hive编程实践)
- html如何在li里加a,li里面嵌套a标签html和css小例子
- Python获取两个列表list的不同之处
- 给1-3年的前端 6 点诚心建议
- 哥德巴赫猜想(信息学奥赛一本通-T1157)
- MSDN Visual系列:在MOSS中创建一个BDC实体
- dropbox pac规则_来自Dropbox的Zulip聊天,Linux Foundation报告,FCC规则以及更多新闻
- oracle存储过程插入自动编号,Oracle生成单据编号存储过程的实例代码
- 生意人没有“攀比”的目标,会过的很迷茫
- 性能监控的好工具 - NewRelic 简介
- java kinect_使用java来做Kinect开发
- 关系抽取调研-工业界
- 打不开计算机或文件夹,求助:我的电脑文件夹打不开了
- ETL为什么经常变成ELT甚至LET?
- vim菜单栏不正常显示以及隐藏菜单栏
- 四川一度智信:网店养词技巧
- 证券行业信息化17_我的香港游记3_交易系统技术支持部_会计与结算技术支持部都干些什么?
- OpenGL ES 基础概念
热门文章
- wrapper 并集如何使用
- Java Web开发与实战_Java Web开发技术与实战项目
- javabean与json转换(fastjson与jackson两个版本)
- (转)漫画:什么是分布式事务?
- apache poi_将HTML转换为Apache POI的RichTextString
- adf4351使用_使用ADF绑定创建视图对象行CreateInsert操作
- fegin 参数丢失_许多参数和丢失的信息
- web服务优化与健壮性改进_创建健壮的微服务架构所涉及的组件
- 根据变量推断变量类型_Java A的新本地变量类型推断
- oracle aq_通过Java 8流使用Oracle AQ