Как вернуть 2 значения из метода Java? - PullRequest
155 голосов
/ 14 мая 2010

Я пытаюсь вернуть 2 значения из метода Java, но получаю эти ошибки. Вот мой код:

// Method code
public static int something(){
    int number1 = 1;
    int number2 = 2;

    return number1, number2;
}

// Main method code
public static void main(String[] args) {
    something();
    System.out.println(number1 + number2);
}

Ошибка:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - missing return statement
    at assignment.Main.something(Main.java:86)
    at assignment.Main.main(Main.java:53)

Java Результат: 1

Ответы [ 13 ]

211 голосов
/ 14 мая 2010

Вместо того, чтобы возвращать массив, содержащий два значения, или использовать общий класс Pair, рассмотрите возможность создания класса, представляющего результат, который вы хотите вернуть, и возврата экземпляра этого класса. Дайте классу значимое имя. Преимущества этого подхода по сравнению с использованием массива - безопасность типов, и это значительно облегчит понимание вашей программы.

Примечание. Универсальный класс Pair, как предлагается в некоторых других ответах здесь, также обеспечивает безопасность типов, но не передает то, что представляет собой результат.

Пример (в котором не используются действительно значимые имена):

final class MyResult {
    private final int first;
    private final int second;

    public MyResult(int first, int second) {
        this.first = first;
        this.second = second;
    }

    public int getFirst() {
        return first;
    }

    public int getSecond() {
        return second;
    }
}

// ...

public static MyResult something() {
    int number1 = 1;
    int number2 = 2;

    return new MyResult(number1, number2);
}

public static void main(String[] args) {
    MyResult result = something();
    System.out.println(result.getFirst() + result.getSecond());
}
64 голосов
/ 14 мая 2010

Java не поддерживает возврат нескольких значений. Возвращает массив значений.

// Function code
public static int[] something(){
    int number1 = 1;
    int number2 = 2;
    return new int[] {number1, number2};
}

// Main class code
public static void main(String[] args) {
  int result[] = something();
  System.out.println(result[0] + result[1]);
}
36 голосов
/ 14 мая 2010

Вы можете реализовать универсальный Pair, если уверены, что вам просто нужно вернуть два значения:

public class Pair<U, V> {

 /**
     * The first element of this <code>Pair</code>
     */
    private U first;

    /**
     * The second element of this <code>Pair</code>
     */
    private V second;

    /**
     * Constructs a new <code>Pair</code> with the given values.
     * 
     * @param first  the first element
     * @param second the second element
     */
    public Pair(U first, V second) {

        this.first = first;
        this.second = second;
    }

//getter for first and second

и затем метод возвращает Pair:

public Pair<Object, Object> getSomePair();
22 голосов
/ 14 мая 2010

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

return new Pair<Integer>(number1, number2);

Вот обновленная версия вашего кода:

public class Scratch
{
    // Function code
    public static Pair<Integer> something() {
        int number1 = 1;
        int number2 = 2;
        return new Pair<Integer>(number1, number2);
    }

    // Main class code
    public static void main(String[] args) {
        Pair<Integer> pair = something();
        System.out.println(pair.first() + pair.second());
    }
}

class Pair<T> {
    private final T m_first;
    private final T m_second;

    public Pair(T first, T second) {
        m_first = first;
        m_second = second;
    }

    public T first() {
        return m_first;
    }

    public T second() {
        return m_second;
    }
}
5 голосов
/ 14 мая 2010

вы должны использовать коллекции, чтобы вернуть более одного возвращаемого значения

в вашем случае вы пишете код как

public static List something(){
        List<Integer> list = new ArrayList<Integer>();
        int number1 = 1;
        int number2 = 2;
        list.add(number1);
        list.add(number2);
        return list;
    }

    // Main class code
    public static void main(String[] args) {
      something();
      List<Integer> numList = something();
    }
4 голосов
/ 02 июня 2018

Вот действительно простое и короткое решение с SimpleEntry:

AbstractMap.Entry<String, Float> myTwoCents=new AbstractMap.SimpleEntry<>("maximum possible performance reached" , 99.9f);

String question=myTwoCents.getKey();
Float answer=myTwoCents.getValue();

Используются только встроенные функции Java, и он имеет преимущество типа safty.

4 голосов
/ 28 июля 2016

Используйте объект типа Pair / Tuple, вам даже не нужно создавать объект, если вы зависите от Apache commons-lang. Просто используйте класс Pair .

3 голосов
/ 25 января 2014
public class Mulretun
{
    public String name;;
    public String location;
    public String[] getExample()
    {
        String ar[] = new String[2];
        ar[0]="siva";
        ar[1]="dallas";
        return ar; //returning two values at once
    }
    public static void main(String[] args)
    {
        Mulretun m=new Mulretun();
        String ar[] =m.getExample();
        int i;
        for(i=0;i<ar.length;i++)
        System.out.println("return values are: " + ar[i]);      

    }
}

o/p:
return values are: siva
return values are: dallas
2 голосов
/ 14 ноября 2017

Мне любопытно, почему никто не придумал более элегантное решение для обратного вызова. Поэтому вместо использования возвращаемого типа вы используете обработчик, переданный в метод в качестве аргумента. Пример ниже имеет два противоположных подхода. Я знаю, какой из этих двух вариантов более элегантен для меня. : -)

public class DiceExample {

    public interface Pair<T1, T2> {
        T1 getLeft();

        T2 getRight();
    }

    private Pair<Integer, Integer> rollDiceWithReturnType() {

        double dice1 = (Math.random() * 6);
        double dice2 = (Math.random() * 6);

        return new Pair<Integer, Integer>() {
            @Override
            public Integer getLeft() {
                return (int) Math.ceil(dice1);
            }

            @Override
            public Integer getRight() {
                return (int) Math.ceil(dice2);
            }
        };
    }

    @FunctionalInterface
    public interface ResultHandler {
        void handleDice(int ceil, int ceil2);
    }

    private void rollDiceWithResultHandler(ResultHandler resultHandler) {
        double dice1 = (Math.random() * 6);
        double dice2 = (Math.random() * 6);

        resultHandler.handleDice((int) Math.ceil(dice1), (int) Math.ceil(dice2));
    }

    public static void main(String[] args) {

        DiceExample object = new DiceExample();


        Pair<Integer, Integer> result = object.rollDiceWithReturnType();
        System.out.println("Dice 1: " + result.getLeft());
        System.out.println("Dice 2: " + result.getRight());

        object.rollDiceWithResultHandler((dice1, dice2) -> {
            System.out.println("Dice 1: " + dice1);
            System.out.println("Dice 2: " + dice2);
        });
    }
}
2 голосов
/ 28 июля 2016

По моему мнению, лучше всего создать новый класс, конструктор которого является нужной вам функцией, например ::

public class pairReturn{
        //name your parameters:
        public int sth1;
        public double sth2;
        public pairReturn(int param){
            //place the code of your function, e.g.:
            sth1=param*5;
            sth2=param*10;
        }
    }

Затем просто используйте конструктор, как если бы вы использовали функцию:

pairReturn pR = new pairReturn(15);

и вы можете использовать pR.sth1, pR.sth2 как "2 результата функции"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...