使Java类在Clojure中作为序列工作

mik*_*era 8 java clojure sequence clojure-java-interop

我使用的Java类代表一系列结果(有点像Clojure向量).

我想将这个类与典型的Clojure序列函数一起使用(即我希望该类的行为就像它支持序列抽象一样)但是我无法更改类,因此无法使其实现clojure.lang.Seqable或类似.另外,令人讨厌的是,该课程没有实现java.util.Collectionjava.lang.Iterable.

我可以看到几个选项:

  • 使用iterator-seq该对象的(现有的)迭代器.
  • 将对象包装在另一个实现java.util.Collection/的类中clojure.lang.Sequable
  • 创建一个通过查询Object来构建Clojure向量或序列的函数

还有其他选择吗?什么是最好的方法?

M S*_*ith 6

最快,最直接的就是使用iterator-seq.

这确实提出了一个问题:为什么核心Clojure不提供像SeqSource这样的协议seq.然后可以"扩展"非标准集合以提供seq,类似于InternalReduce的工作方式reduce.

  • 因为seq是(a)编译器使用的,因此需要是java友好的(即接口),并且(b)非常经常调用,因此它需要尽可能快 - 协议更快比很多东西,但不如简单的界面调度快. (7认同)

noa*_*hlz 6

使用proxy扩展类,并使其实现ISeq