做会计网站的流程,友情链接交换软件,用psd做的买书网站,简述dw网站建设步骤这是最近比较有趣的Stack Overflow问题之一#xff1a; 为什么Iterable不提供stream#xff08;#xff09;和parallelStream#xff08;#xff09;方法#xff1f; 最初#xff0c;直接将Iterable转换为Stream似乎很直观#xff0c;因为在90#xff05;的用例中 为什么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 staticT StreamT stream(IterableT 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原语类型进行操作时如果有人疯狂地编写IterableInteger 那么他们可能会接受一些解决方法。 翻译自: https://www.javacodegeeks.com/2014/12/really-too-bad-that-java-8-doesnt-have-iterable-stream.html