如何从Java方法返回2个值?

jav*_*ava 168 java function return-value

我试图从Java方法返回2个值但我得到这些错误.这是我的代码:

// 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);
}
Run Code Online (Sandbox Code Playgroud)

错误:

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)
Run Code Online (Sandbox Code Playgroud)

Java结果:1

Jes*_*per 224

不要返回包含这两个值或使用泛型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());
}
Run Code Online (Sandbox Code Playgroud)

  • 我非常强烈地认为Java应该允许您返回多个值.它会更快(创建更少的对象),并且每次你想要做一些不同的事情时都不需要额外的类(膨胀代码).我没有看到任何缺点,也许有人可以开导我? (36认同)
  • 您可以使用java.util.AbstractMap.SimpleEntry中的SimpleEntry <type_of_value_1,type_of_value_2>并将其与getKey()一起使用以获取对象1和getValue()以获取对象2 (3认同)
  • @AnumSheraz"如何......就像在Python中一样"的答案是:你没有,因为Java没有这样的语言功能...... (3认同)
  • 将来,Java 可能会提供一种基于与记录的模式匹配的便捷方法,从一个方法返回多个值。但这在 Java 17 中尚不可用。 (2认同)

Mat*_*att 67

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]);
}
Run Code Online (Sandbox Code Playgroud)

  • 这几乎总是错误的,特别是如果两个结果值的类型不同. (6认同)
  • @BarAkiva,它错误的原因是因为你松散了类型安全.如果您返回的是同类型的值,那么您应该总是更喜欢列表而不是数组.特别是,如果您正在处理泛型值,那么List <T>总是首选作为T []的返回值,因为您总是可以在泛型类型上构造List但从不构造数组; 你不能这样做:"新T [长度];" 如此处针对不同类型创建Pair类的方法对于异类类型是更好的选择. (6认同)

Lar*_*ren 39

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
Run Code Online (Sandbox Code Playgroud)

然后让方法返回Pair:

public Pair<Object, Object> getSomePair();
Run Code Online (Sandbox Code Playgroud)


ric*_*chj 27

你只能在Java中返回一个值,所以最好的方法是这样的:

return new Pair<Integer>(number1, number2);
Run Code Online (Sandbox Code Playgroud)

这是您的代码的更新版本:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)


Use*_*F40 6

使用 Pair/Tuple 类型对象,如果你依赖 Apache commons-lang,你甚至不需要创建一个。只需使用Pair类。


Cod*_*ine 6

这是使用SimpleEntry真正真正简单的解决方案:

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

String question=myTwoCents.getKey();
Float answer=myTwoCents.getValue();
Run Code Online (Sandbox Code Playgroud)

仅使用Java内置函数,并且具有类型安全性好处。


Gur*_*lki 5

你必须使用集合来返回多个返回值

在你的情况下,你编写代码为

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();
    }
Run Code Online (Sandbox Code Playgroud)