Как вернуть несколько объектов из метода Java? - PullRequest
160 голосов
/ 19 января 2009

Я хочу вернуть два объекта из метода Java, и мне было интересно, что может быть хорошим способом сделать это?

Возможные способы, которые я могу придумать: вернуть HashMap (поскольку два объекта связаны) или вернуть ArrayList из Object объектов.

Если быть более точным, два объекта, которые я хочу вернуть, это (a) List объектов и (b) разделенные запятыми имена одного и того же.

Я хочу вернуть эти два объекта из одного метода, потому что я не хочу перебирать список объектов, чтобы получить имена через запятую (что я могу сделать в том же цикле в этом методе).

Почему-то возвращение HashMap не выглядит очень элегантным способом сделать это.

Ответы [ 25 ]

1 голос
/ 02 июля 2011
public class MultipleReturnValues {

    public MultipleReturnValues() {
    }

    public static void functionWithSeveralReturnValues(final String[] returnValues) {
        returnValues[0] = "return value 1";
        returnValues[1] = "return value 2";
    }

    public static void main(String[] args) {
        String[] returnValues = new String[2];
        functionWithSeveralReturnValues(returnValues);
        System.out.println("returnValues[0] = " + returnValues[0]);
        System.out.println("returnValues[1] = " + returnValues[1]);
    }

}
0 голосов
/ 24 марта 2015

Передайте список вашему методу и заполните его, затем верните строку с именами, например:

public String buildList(List<?> list) {
    list.add(1);
    list.add(2);
    list.add(3);
    return "something,something,something,dark side";
}

Тогда назовите это так:

List<?> values = new ArrayList<?>();
String names = buildList(values);
0 голосов
/ 25 марта 2014

Я использовал очень простой подход для решения проблем множественных возвратов. Он служит цели и избегает сложности.

Я называю это строковым разделителем Подход

И это эффективно, поскольку он может даже возвращать значения Несколько типов Например. int, double, char, string и т. д.

В этом подходе мы используем строку, которая очень маловероятна в общем случае. Мы называем это разделителем. Этот разделитель будет использоваться для разделения различных значений при использовании в функции

Например, мы получим наш окончательный возврат как (например) разделитель intValue разделитель doubleValue ... И затем, используя эту строку, мы получим всю необходимую информацию, которая также может быть разных типов

Следующий код покажет работу этой концепции

В качестве разделителя используется ! @ # и 3 значения возвращаются intVal, doubleVal и stringVal

        public class TestMultipleReturns {

            public static String multipleVals() {

                String result = "";
                String separator = "!@#";


                int intVal = 5;
                // Code to process intVal

                double doubleVal = 3.14;
                // Code to process doubleVal

                String stringVal = "hello";
                // Code to process Int intVal

                result = intVal + separator + doubleVal + separator + stringVal + separator;
                return (result);
            }

            public static void main(String[] args) {

                String res = multipleVals();

                int intVal = Integer.parseInt(res.split("!@#")[0]);
                // Code to process intVal

                double doubleVal = Double.parseDouble(res.split("!@#")[1]);
                // Code to process doubleVal

                String stringVal = res.split("!@#")[2];

                System.out.println(intVal+"\n"+doubleVal+"\n"+stringVal);
            }
        }

OUTPUT

5
3.14
hello
BUILD SUCCESSFUL (total time: 2 seconds)
0 голосов
/ 19 января 2009

ПРОЙДИТЕ ХАШ В МЕТОД И ПОПУЛЯЕТ ЕГО ......

public void buildResponse (Строковые данные, Ответ карты);

0 голосов
/ 02 апреля 2013

В C вы бы сделали это, передав указатели на заполнители для результатов в качестве аргументов:

void getShoeAndWaistSizes(int *shoeSize, int *waistSize) {
    *shoeSize = 36;
    *waistSize = 45;
}
...
int shoeSize, waistSize;
getShoeAndWaistSize(&shoeSize, &waistSize);
int i = shoeSize + waistSize;

Давайте попробуем нечто подобное в Java.

void getShoeAndWaistSizes(List<Integer> shoeSize, List<Integer> waistSize) {
    shoeSize.add(36);
    waistSize.add(45);
}
...
List<Integer> shoeSize = new List<>();
List<Integer> waistSize = new List<>();
getShoeAndWaistSizes(shoeSize, waistSize);
int i = shoeSize.get(0) + waistSize.get(0);
...