【问题标题】:How To Use Classic Custom Data Structures As Java 8 Streams如何使用经典的自定义数据结构作为 Java 8 流
【发布时间】:2016-04-24 13:25:34
【问题描述】:

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

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

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

我从 Iterator 开始,但它似乎并不完整。

有人有什么建议吗?

【问题讨论】:

  • 只要你的自定义Collection实现了Collection接口,你就会拥有stream()方法,并且能够使用流管道处理你的自定义类。
  • 谢谢 Eran,我会试试我的链表实现,看看是否能解决问题。

标签: data-structures lambda java-8


【解决方案1】:

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

拥有Spliterator 后,您可以使用StreamSupport.stream() 轻松将其转换为流。实际上,这是来自AbstractCollectionstream() 方法(大多数集合只是继承):

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

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

【讨论】:

    【解决方案2】:

    我会查看 http://www.javaslang.io 以获得灵感,这是一个完全可以完成您想做的事情的库:以 Java 8 方式实现自定义列表、树等。

    它特别与导入/导出方法之外的 JDK 集合紧密结合,但重新实现了 Scala(或其他 FP 语言)开发人员期望的所有不可变集合语义。

    【讨论】:

    • 谢谢 Lukas,我完全不知道那个库。我去看看。
    • 我刚刚拉下了 GitHub 源码。它比我想象的要广泛得多。那位数据结构教授将不得不扔掉那些旧笔记。
    • @duffymo:确实,除了 Java 集合之外,还有一个世界 :)(而 javaslang 只是皮毛而已)
    • Jaysus,我不能再写代码了。这会让本科生的脑袋爆炸。
    • 我只是为 inspiration 推荐了这个库 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 2021-10-05
    • 2017-04-21
    • 1970-01-01
    相关资源
    最近更新 更多