Передача массива двойников из Java в Python с использованием Py4J

#java #python #py4j

Вопрос:

Я хочу отправлять массивы double s (или float s) с Java на Python с помощью Py4J. Но, похоже, это не работает. Вот мой MWE на стороне Java.

Основная программа
 public class TheExample {
    
    private double sq[];

    public double twoTimes(double element) {
        return 2*element ;
    }
    
    public double[] squares(double x, double y) {
        sq = new double[2];
        sq[0] = x*x ;
        sq[1] = y*y ;
        return sq ;
    }

}
 
Программа точки входа
 import py4j.GatewayServer;

public class TheExampleEntryPoint {

    private TheExample thex;

    public TheExampleEntryPoint() {
      thex = new TheExample();
    }

    public TheExample getThex() {
        return thex;
    }

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

}
 

После запуска сервера шлюза я получил доступ к объекту из Python:

 >>> from py4j.java_gateway import JavaGateway
>>> gateway = JavaGateway()
>>> thex = gateway.entry_point.getThex()
>>> thex.twoTimes(9.0)
18.0
>>> thex.squares(2.0, 3.0)
JavaObject id=o1
>>> ### ??? The surprise
 

Как правильно отправить массив double s или float s из Java в Python?

Мой вариант использования прост: мне нужно только получить значения из Java. Нет необходимости иметь возможность изменять массив ( list на стороне Python). Следовательно, если получить его как tuple » а » возможно и проще, это еще лучше.

Спасибо!

Ответ №1:

Мое текущее решение состоит в том, чтобы использовать List в Java, как показано ниже:

Основная программа

 import java.util.List;
import java.util.ArrayList;

public class TheExample {
    
    public double twoTimes(double element) {
        return 2*element ;
    }
    
    public List<Double> squares(double x, double y) {
        List<Double> sq = new ArrayList<Double>();
        sq.add(x*x) ;
        sq.add(y*y) ;
        return sq ;
    }

}
 

И это работает, как и ожидалось, на стороне Python:

 >>> from py4j.java_gateway import JavaGateway
>>> gateway = JavaGateway()
>>> thex = gateway.entry_point.getThex()
>>> thex.twoTimes(9.0)
18.0
>>> thex.squares(2.0, 3.0)
[4.0, 9.0]