Java中如何返回多个值?


11

有时您想从一个函数返回多个值。 通常在Java中如何完成?

一种选择是使用数组,例如返回列表或元组的Python代码段:

value, success = read_unreliably()
if success:
    print value

另一个选择是返回哈希/字典,如下面的JavaScript示例:

var result = readUnreliably()
if (result.success) {
    alert(value);
}

还有一种方法就是为此目的创建一个自定义对象,例如以下Java示例:

ReadUnreliablyResult result = readUnreliably()
if (result.getSuccess()) {
    System.out.println(result.getValue());
}

当然,您也可以只使用一些全局变量来存储所需的内容,而不用传递东西,但是我们只能说这不是一种选择。


“真正的” java人真的会遇到使用公共获取器和设置器来隐藏诸如此类的内部小类上的字段的麻烦吗?只是好奇。
克里斯·法默

3
是的,大多数都可以。由于许多框架都希望使用JavaBean标准,因此您可能会后悔没有getter和setter。无论如何,您的IDE都会为您生成它们。
埃里克·威尔逊

3
或者,您也可以根据YAGNI原则将其排除在外。但这似乎并不像人们期望的那样频繁。
MatrixFrog 2011年

@FarmBoy:我想我对bean等了解,但是OP暗示这只是一个一次性类,旨在返回多个值。
克里斯·法默

@ChrisFarmer我想在这种情况下,我从未见过“真正的” Java程序员为此目的创建类。
埃里克·威尔逊

Answers:


26

这通常在Java中如何完成?

痛苦的。

一种选择是使用数组,例如返回列表或元组的Python片段。

另一个选择是返回哈希/字典,如下面的JavaScript示例...

这些技术在Java中效果不佳;这些值必须从Object向下转换。

还有一个方法就是为此目的创建一个自定义对象,例如下面的Java示例...

这是最常见的,但是创建所有这些小类很繁琐。在C ++中,通常使用std :: pair,但这在Java中并不常见。

使用Lombok,创建少量自定义对象非常容易:

@RequiredArgsConstructor
public class X {
  private final boolean status;
  private final byte[] data;

}


10
“这通常在Java中如何完成?” “很痛苦。” 大声笑作为Java开发人员,我必须为此为此+1
TheLQ 2011年

使用紧凑的,不可变的类结构类并不是那么痛苦……这确实就像编写C结构一样……
Guillaume11年

1
@Guillaume-可以,但是所有这些小事都会在时间和空间上加在一起。我不知道为什么Java社区没有采用一组标准的泛型,例如“ class Pair <T1,T2> {public T1首先; public T2其次; ...}”;在现代语言中,您只需“返回a,b”;然后写“ x,y = f()”;
凯文·克莱恩

1
我确定某些“古老”语言也可以做到这一点:)恕我直言,我发现多个返回值可能导致混乱,如果您需要添加其他返回字段,则只需更新类之类的结构即可,更改您的方法签名。
Guillaume

1
那个“痛苦”。令我震惊的是,当遇到类似情况时,这确实是我作为Java开发人员的感受。
artjom 2013年

13

是的,方法来建立一个struct/ tuple/ record在Java中是通过创建一个类。如果只供内部使用,我更喜欢使用带有公共字段的小型不变结构类。

例子:

public class Unreliably {
    public final boolean success;
    public final int value;
    public Unreliably(boolean success, int value) {
        this.success = success; this.value = value;
    }
}

这在Scala中更容易做到:

case class Unreliably(success: Boolean, value: Int)

8
实际上,在Scala中,通常可能只返回一个Tuple2[Boolean, Int]。尽管在此特定示例中,您将返回Option[Int]
约尔格W¯¯米塔格

2
因此,这回答了克里斯·法默(Chris Farmer)的问题(在Q的评论中),即真正的Java员工不一定会为少量内部类创建吸气剂和吸气剂。您是一个“真正的” Java人,对吗?
Mike M. Lin

2
在其他新闻中,没有真正的苏格兰人。
约瑟夫·魏斯曼

5

对于您给出的示例,抛出异常将是处理该异常的最标准方法:

try {
    result = readUnreliably();
    System.out.println(result);
} (catch IOException e) {
    System.out.println("Could not read file");
}

此外,如果您努力拥有“做一件事”的功能,那么返回多个值的功能就没有必要了,尽管有时很方便。


4

我们有一个Pair通用类,可以存储A的一个实例和B的一个实例。您可能可以用相同的方式创建Triplet或Quadruplet。

public class Pair<A, B>
{
    ...
}

1
但是,这会导致一些真正不可读的代码。如果方法返回Pair<String, Integer>,那是什么意思?这些值代表什么?如果不阅读该方法的实现,可能无法知道。
2016年

1

在Java中,您的函数将返回一个对象(如果失败,则返回null)。这样,可以返回多个数据。


1

在Java中,没有明确的方法可以返回多个变量,但是有几种方法:

  1. 首先是走阵列的路。仅当所有内容都具有相同的数据类型或可以将它们临时转换为一种类型时,这才真正起作用。
  2. 第二种方法是创建一个类,以传输多个变量类型。在我的工作中,我们将这些称为DTO或数据传输对象。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.