【问题标题】:Converting Java collections to Clojure data structures将 Java 集合转换为 Clojure 数据结构
【发布时间】:2012-03-05 17:41:30
【问题描述】:

我正在使用返回 java.util.LinkedHashSet 的方法创建到 Java API 的 Clojure 接口。

首先,处理此问题的惯用 Clojure 方式是否将 LinkedHashSet 转换为 clojure 数据结构?

其次,将 Java 集合转换为 Clojure 数据结构的最佳方法是什么?

【问题讨论】:

    标签: java collections clojure idioms java-interop


    【解决方案1】:

    有很多选择,因为 Clojure 非常适合 Java 集合。这取决于你想在 Clojure 中使用什么数据结构。

    这里有一些例子:

    ;; create a HashSet
    (def a (java.util.HashSet.))
    (dotimes [i 10] (.add a i))
    
    ;; Get all the values as a sequence 
    (seq a)
    => (0 1 2 3 4 5 6 7 8 9)
    
    ;; build a new HashSet containing the values from a 
    (into #{} a)
    #{0 1 2 3 4 5 6 7 8 9}
    
    ;; Just use the HashSet directly (high performance, no copy required)
    (.contains a 1)
    => true
    (.contains a 100)
    => false
    

    关于何时使用这些,我建议以下建议:

    • 如果您尝试包装 Java 库并提供干净的 Clojure API,那么我建议转换为等效的 Clojure 数据结构。这是 Clojure 用户所期望的,您可以隐藏潜在的混乱 Java 互操作细节。作为奖励,这将使事物不可变,这样您在使用 Java 集合时就不会面临发生变异的风险。
    • 如果您只想快速高效地使用 Java API,只需在 Java 集合上直接使用 Java 互操作即可。

    【讨论】:

      【解决方案2】:

      将 java 集合转换为 clojure 的惯用方法是使用 (seq) 函数,大多数操作序列的函数都已调用该函数。

      (def s (java.util.LinkedHashSet.))
      #'user/s
      user> (seq s)
      nil
      user> (.add s "foo")
      true
      user> (seq s)
      ("foo")
      user> 
      

      【讨论】:

        【解决方案3】:

        老实说,我不知道是否存在普遍接受的做法,但这里是 Chris Houser arguing 反对 Java 到 Clojure 适配器,因为您破坏了与原始 Java API 的兼容性。

        要执行您要求的翻译,只需使用into

        user=> (import java.util.LinkedHashSet)
        java.util.LinkedHashSet
        user=> (def x (LinkedHashSet.))
        #'user/x
        user=> (.add x "test")
        true
        user=> (def y (into #{} x))
        #'user/y
        user=> y
        #{"test"}
        

        【讨论】:

          猜你喜欢
          • 2011-05-17
          • 2017-08-04
          • 1970-01-01
          • 2014-11-02
          • 1970-01-01
          • 2016-01-27
          • 1970-01-01
          • 1970-01-01
          • 2010-10-15
          相关资源
          最近更新 更多