如何在 py4j 中将 Java 列表转换为 Python 列表

Posted

技术标签:

【中文标题】如何在 py4j 中将 Java 列表转换为 Python 列表【英文标题】:How to convert a Java List to a Python list in py4j 【发布时间】:2018-10-23 05:44:33 【问题描述】:

我想知道是否可以将通过 Python 中的 Java 网关接收的 JavaList 转换为 python 列表,如果可以,如何转换。或者类似的东西是原生的 python 类型。

在 py4j 的文档中,我只能看到将 python 类型转换为 java,但反之则不然。

【问题讨论】:

【参考方案1】:

正如官方文档advanced topics section 下所述,Array、List、Set、Map、Iterator 类型的 Java 集合在调用 Python 代码中会自动转换为兼容格式。 需要注意的是java列表不是转换成纯Python列表,而是转换成py4j.java_collections.JavaList

让我们看一个例子来证明这一点:

JAVA 代码:

public class Py4JEntryPoint 

    private List<String> javaList = new ArrayList<>();
    public Py4JEntryPoint()
        javaList.add("Hello");
        javaList.add("How");
        javaList.add("you");
        javaList.add("doin...!!!");
    

    public List<String> getJavaList()
        return javaList;
    

    public static void main(String[] args) 
        GatewayServer gatewayServer = new GatewayServer(new Py4JEntryPoint());
        gatewayServer.start();
        System.out.println("Gateway Server Started");
    

Python 代码,调用网关:

gateway = JavaGateway()

jList = gateway.entry_point.getJavaList()

print(jList)  
#output: ['Hello', 'How', 'you', 'doin...!!!']

print("Type of list returned by Java Gateway", type(jList)) #
#output: Type of list returned by Java Gateway <class 'py4j.java_collections.JavaList'>

pyList = list(jList)

print(pyList)
#output: ['Hello', 'How', 'you', 'doin...!!!']    

print("Type of list after conversion", type(pyList))
#output: Type of list after conversion <class 'list'>

【讨论】:

【参考方案2】:

据我所知,PY4J 会自动将它们转换为 ArrayList 到 python 中的列表。

https://www.py4j.org/

使用包含添加方法的第一个示例,但不返回 an

int 

返回一个

ArrayList<String>

【讨论】:

以上是关于如何在 py4j 中将 Java 列表转换为 Python 列表的主要内容,如果未能解决你的问题,请参考以下文章

使用 py4j 在 java/python 项目中将 Log4j 连接到 ipython notebook stderr

py4j - 我将如何在 java 中调用 python 方法

py4j:如何从 Python 启动 java 网关

如何使用 PY4J 从 python 调用 java

如何隐藏“py4j.java_gateway:Received command c on object id p0”?

结构化流错误 py4j.protocol.Py4JNetworkError:Java 端的答案为空