【问题标题】:Return multiple values in Java在 Java 中返回多个值
【发布时间】:2012-11-03 19:33:27
【问题描述】:

我用 Java 编写了一个函数,我希望这个函数返回多个值。除了使用数组和结构体,有没有办法返回多个值?

我的代码:

String query40 = "SELECT Good_Name,Quantity,Price from Tbl1 where Good_ID="+x;
Cursor c = db.rawQuery(query, null);
if (c!= null && c.moveToFirst()) 
{
  GoodNameShow = c.getString(0);
  QuantityShow = c.getLong(1);
  GoodUnitPriceShow = c.getLong(2);
  return GoodNameShow,QuantityShow ,GoodUnitPriceShow ;
}

【问题讨论】:

  • 重要的不是“Eclipse”,而是语言 (Java)。
  • 我知道您的代码是伪 Java,但请确保您使用 camelCase 命名变量(例如 goodNameShowgoodUnitPriceShow)。

标签: java function return


【解决方案1】:

我遇到过几次(甚至在 java 库本身中)的一种快速而丑陋的方法是将您的值返回为Object[],然后使用强制转换解包。 例如

public Object[] myfunc() {
  String name = "...";
  Integer quantity = 5
  Float price = 3.14
  return new Object[] { name, quantity, price };

然后,它是这样使用的:

Object[] output = myfunc();
String name = (String) output[0];
Integer quantity = (Integer) output[1];
Float price = (Float) price[2];

将值嵌入到专用对象中更简洁,但我还是把它留在这里。

【讨论】:

    【解决方案2】:

    我已经开发了一种非常基本的方法来处理这种情况。

    我在字符串中使用了分隔符的逻辑。

    例如如果你需要在同一个函数中返回 1.int值 2.双重价值 3.字符串值

    你可以使用分隔符字符串

    例如",.,"这种字符串一般不会出现在任何地方。

    您可以返回一个由此分隔符分隔的所有值组成的字符串 ",.,,.,"

    并转换为使用 String.split(separtor)[index]

    调用函数的等效类型

    请参考以下代码解释-

    使用的分隔符=",.,"

    public class TestMultipleReturns{
    
     public static void main(String args[]){
    
       String result =  getMultipleValues();
       int intval = Integer.parseInt(result.split(",.,")[0]);
       double doubleval = Double.parseDouble(result.split(",.,")[1]);     
        String strval = result.split(",.,")[2];
     }
    
     public static String getMultipleValues(){
    
       int intval = 231;//some int value      
       double doubleval = 3.14;//some double val
       String strval = "hello";//some String val
    
       return(intval+",.,"+doubleval+",.,"+strval);
    
     }
    }
    

    当您不想只为函数返回增加类的数量时,这种方法可以用作快捷方式

    这取决于具体情况采取哪种方法。

    【讨论】:

    • 虽然这个建议不会增加类的数量,但它是一种可怕的方法,原因有很多:你创建了多个不必要的对象(StringBuilderStrings),这些对象比一个实用程序类的单个实例。检索值的努力是不合理的,需要不必要的代码并且对性能有明显的影响。正如您已经注意到的,分隔符不能出现在字符串中,这通常是一个不合理的假设。
    • 我投了反对票,只是因为人们从未真正使用过这种方法。这对性能和可读性不利,而且 calee 永远不知道从这样的返回中期待什么。
    • @still_learning - 我知道这种方法在性能方面非常糟糕,但这只是我在开始编程时所做的一部分实践。我主要在 julia 和 matlab 上工作,您可以在其中返回多个 val,例如返回 var1、var2 等……所以当我开始使用 JAVA 时,我只是作为练习的一部分。我实际上认为它会很好用,但后来我觉得它的性能很差。
    【解决方案3】:

    在Java中,当你希望一个函数返回多个值时,你必须

    • 将这些值嵌入到您返回的对象中
    • 或更改传递给您的函数的对象

    在您的情况下,您显然需要定义一个类Show,它可能具有字段namequantityprice

    public class Show {
        private String name;
        private int price;
        // add other fields, constructor and accessors
    }
    

    然后将您的功能更改为

     public  Show  test(){
          ...
          return new Show(GoodNameShow,QuantityShow ,GoodUnitPriceShow) ;
    

    【讨论】:

    • @estiedi 你是说Collection.sort 风格不好?如果你试图让不了解该语言最基本事实的人理解它,你就无法编写高效的代码。如果有人不知道接收到的对象可以通过方法更改,那么他必须在参与专业团队之前学习。
    • 语言没有从 CLU 示例中学习仍然令人遗憾。 CLU 相关的多重赋值有半可疑用途 (x,y = y,x),但多重返回值非常很有用 (x,y = function(params))。强制返回包装对象(通常通过类似于class Pair<A,B> 的“干净”声明)在非常多的紧调用下会受到惩罚,并且传递一个对象来保存返回值是非常混乱的,没有编译器保证这些字段被填充。
    • @tgm1024 你应该看看 Go,其中机器人返回多个值和多个赋值非常有用;)
    猜你喜欢
    • 1970-01-01
    • 2017-08-30
    • 2011-08-02
    • 2013-05-12
    • 2011-06-12
    • 1970-01-01
    • 2021-07-05
    相关资源
    最近更新 更多