我看到了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/