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

2024-04-06

I saw a 那么问题 https://stackoverflow.com/questions/36810942/linkedlist-get-method昨天关于用 Java 实现一个经典的链表。这显然是本科生数据结构课上的作业。很容易找到所有语言的列表、树等的问题和实现。

我一直在学习 Java lambda 表达式,并尝试抓住一切机会使用它们来掌握这个习惯用法。这个问题让我想知道:我如何编写自定义列表或树,以便可以在所有 Java 8 lambda 机制中使用它?

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

我从一个Iterator,但它的功能似乎并不完整。

有人有建议吗?


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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用经典自定义数据结构作为 Java 8 流 的相关文章

随机推荐