小编Gas*_*ium的帖子

如何实现Java 8 Stream流畅的API并且懒洋洋地计算

我想找出一个简单的实现等同于Java的8 ,让我去探索的查询算法计算懒洋洋的发展(如map(),filter(),reduce(),等).注意:实现比Stream更好的解决方案不是我的目标.另一方面,我唯一的目标是了解Stream内部.

然而,我发现的每个实现都基于Iterable<T>,例如以下答案中提供的解决方案:

然而,我对这些解决方案感到不舒服,因为:

  1. 他们太冗长了.
  2. 它们对于新的查询方法不灵活.包含新的查询方法需要进行结构修改.
  3. 尽管存在查询参数,但它们并没有利用新的Java 8功能,例如:第一类函数或默认方法.
  4. 他们都没有使用上面使用的Spliterator<T>方法Stream<T>.

我知道这Spliterator<T>是为了允许分区和并行处理,但我认为它的独特迭代器方法(boolean tryAdvance(Consumer<t>))可以被利用到新的替代品而不是上面列出的那些.此外,正如Brian Goetz所述:

SpliteratorIterator即使没有并行性,也是更好的.(他们通常也更容易写,更容易出错.)

那么,是否有可能开发出一种更易读,更简单,更简洁,更灵活的查询API实现,并且基于相同的原理Stream<T>(并行处理部分除外)?

如果是的话,你怎么能这样做?我希望看到比上面列出的更简单的实现,如果可能的话,利用新的Java 8功能.

要求:

  • 不要重用Java 8 API中的现有方法
  • 并行处理功能超出了本问题的范围.
  • 如果可能,更好,不要使用该Iterable<T>方法.

我的问题的原因?我认为学习查询API(如Stream)的最佳方法是尝试自己实现这些相同的方法.我在学习时已经成功完成了.net Linq.当然,我没有比Linq更好的实现,但这有助于我理解内部部分.所以,我试图按照相同的方法学习Stream.

这并不是那么不寻常.有以下这种方法对于其他技术,如许多作坊功能的JavaScript车间,其中大部分练习要求对现有方法这样实现:map(),filter(),reduce(),call(),bind(),等...

选择的答案:现在我认为米格尔·甘博亚的答案是我的选择,而不是Tagir Valeev的答案,因为后者不允许的implementaton findAny()findFirst() …

collections lambda higher-order-functions java-8 java-stream

1
推荐指数
1
解决办法
1662
查看次数