【问题标题】:convert list of strings to list of java type objects in clojure将字符串列表转换为 clojure 中的 java 类型对象列表
【发布时间】:2021-12-04 01:58:18
【问题描述】:

我正在使用 mongo java 驱动程序和 clojure 进行 mongo 连接,在 java 中建立连接我使用以下代码 sn-p

import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.ServerAddress;

MongoClientURI uri = new MongoClientURI("mongodb://xxx:***@url:27017/test?readPreference=primary");
List<String> hosts = uri.getHosts();
List<ServerAddress> serverList = new LinkedList<>();

for(String host:hosts) {
    serverList.add(new ServerAddress(host)); //updated
}

我想在 clojure 中获得同样的功能,所以我尝试了这个

(def uri (MongoClientURI. uri))
(def hosts (.getHosts uri))

现在我有了字符串主机列表,如何将它们转换为 ServerAddress 类型的列表?

【问题讨论】:

    标签: mongodb clojure clojurescript clojure-java-interop


    【解决方案1】:

    在 Java 代码中可能有点难以发现的是,因为 serverListList&lt;ServerAddress&gt;,所以当您向其中添加 String 对象时,它们会通过后者的构造函数隐式转换为 ServerAddress 对象。

    类似以下的内容应该可以满足您的需求:

    (def host (map #(ServerAddress. %) (.getHosts uri)))
    

    请注意,此时您将拥有一个 Clojure 序列 - 如果您将其传递给 Java 方法,您可能需要键入提示,甚至将其倒入(可变)Java List

    【讨论】:

    • 不,Java 代码是错误的。它不会隐式进行任何转换,只是无法编译。
    • OP 的帖子中没有足够的信息让我轻松尝试 Java 代码(什么依赖项?什么版本?)并且 OP 接受了我的回答,所以... 耸耸肩
    • 当然,你的答案是完全正确的,他们只需要一种特定的方式将字符串转换为 Foo。只是Java从不做任何隐式转换,除了向上转换,而且ServerAddress显然不是String的超类型,所以我们很容易看出Java代码也没有编译。
    猜你喜欢
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    相关资源
    最近更新 更多