data-structures - 如何使用经典的自定义数据结构作为 Java 8 流

标签 data-structures lambda java-8

我看到了SO question昨天关于在 Java 中实现一个经典的链表。这显然是本科数据结构类(class)的作业。很容易找到所有语言的列表、树等的问题和实现。

我一直在学习 Java lambda,并尝试利用每一个机会来掌握这个成语。这个问题让我想知道:我将如何编写自定义列表或树,以便可以在所有 Java 8 lambda 机器中使用它?

我看到的所有示例都使用内置集合。这些对我有用。我更好奇教授数据结构的教授应该如何重新思考他们的技术以反射(reflect) lambdas 和函数式编程。

我从 Iterator 开始,但它似乎没有完全功能。

有人有建议吗?

最佳答案

公开任意数据结构的流 View 非常容易。您必须实现的关键接口(interface)是Spliterator ,顾名思义,它结合了两件事——顺序元素访问(迭代)和分解(拆分)。

一旦你有 Spliterator ,您可以使用 StreamSupport.stream() 轻松将其转换为流.事实上,这里是 stream()来自 AbstractCollection 的方法(大多数集合只是继承):

default Stream<E> stream() {
    return StreamSupport.stream(spliterator(), false);
}

所有真正的工作都在spliterator()方法 - 并且拆分器质量范围广泛(您需要实现的绝对最小值是 tryAdvance ,但如果这就是您实现的全部,它将按顺序工作,但会失去大多数流优化。)查看JDK 源代码 Arrays.stream() , IntStream.range() ) 有关如何做得更好的示例。)

关于data-structures - 如何使用经典的自定义数据结构作为 Java 8 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36823726/

相关文章:

algorithm - 在图连接算法中寻找邻居节点

java - 使用内部列表条件过滤列表

Java 8 组合,柯里化(Currying)简写

java - 删除的实体在相关实体的列表中,但我无法通过存储库找到它

algorithm - 检查图是否是二分的并添加每条新边

最坏情况复杂度与输入大小成反比的算法?

java - 树节点数据结构解释

ruby lambda 捕获 : a weird effect and workaround

java - 验证 completablefutures 列表的大小

java - 如何过滤动态嵌套的列表对象java 8