上一篇
在Java中,可通过以下方式返回多个值:,1. 使用数组或集合(如Object[]、List)封装数据;,2. 自定义类或记录(Record)存储多个字段;,3. 使用Pair/Triple等元组类(需第三方库);,4. 通过Map键值对聚合返回值;,5. 使用可变参数或对象引用间接修改。
使用数组(同类型数据)
public static int[] calculateMinMax(int[] arr) {
int min = Arrays.stream(arr).min().getAsInt();
int max = Arrays.stream(arr).max().getAsInt();
return new int[]{min, max}; // 返回数组
}
// 调用示例
int[] results = calculateMinMax(new int[]{3,1,4});
System.out.println("Min: " + results[0] + ", Max: " + results[1]);
适用场景:返回相同类型数据,简单高效。
自定义类(强类型安全)
// 定义专属结果类
public class OperationResult {
private final double quotient;
private final int remainder;
public OperationResult(double quotient, int remainder) {
this.quotient = quotient;
this.remainder = remainder;
}
// Getter方法...
}
public static OperationResult compute(int a, int b) {
return new OperationResult((double)a/b, a%b);
}
// 调用示例
OperationResult res = compute(10, 3);
System.out.println("商: " + res.getQuotient() + " 余数: " + res.getRemainder());
优势:类型安全、代码可读性高,适合复杂数据结构。
使用Pair/Triple(Apache Commons Lang3)
import org.apache.commons.lang3.tuple.Pair;
public static Pair<String, Integer> getNameAndAge() {
return Pair.of("张三", 25); // 返回键值对
}
// 调用示例
Pair<String, Integer> result = getNameAndAge();
System.out.println("姓名: " + result.getLeft() + " 年龄: " + result.getRight());
依赖:需添加Apache Commons Lang库:

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
返回集合(List/Map)
// 返回List(同类型)
public static List<Object> getMixedData() {
return Arrays.asList("文本数据", 100, true);
}
// 返回Map(键值对)
public static Map<String, Object> getUserInfo() {
Map<String, Object> info = new HashMap<>();
info.put("email", "user@example.com");
info.put("level", 5);
return info;
}
注意:需进行类型转换((String) list.get(0)),存在运行时风险。
Java 14+ 记录类(Record)
public record GeoLocation(double latitude, double longitude) {}
public static GeoLocation getLocation() {
return new GeoLocation(31.2304, 121.4737); // 上海坐标
}
// 调用示例
GeoLocation loc = getLocation();
System.out.println("纬度: " + loc.latitude() + " 经度: " + loc.longitude());
优势:自动生成Getter和toString(),不可变对象线程安全。
使用可变参数容器
public class ResultContainer {
public String name;
public int count;
public boolean status;
// 可添加更多字段...
}
public static ResultContainer fetchData() {
ResultContainer container = new ResultContainer();
container.name = "示例";
container.count = 42;
container.status = true;
return container;
}
适用场景:需要返回多个关联性弱的参数。

通过参数修改(副作用方式)
public static void getCoordinates(double[] output) {
output[0] = 40.7128; // 纬度
output[1] = -74.0060; // 经度
}
// 调用示例
double[] coords = new double[2];
getCoordinates(coords);
System.out.println("纽约坐标: " + coords[0] + ", " + coords[1]);
谨慎使用:破坏封装性,降低代码可维护性。
最佳实践选择指南
| 场景 | 推荐方案 |
|---|---|
| 返回2-3个同类型值 | 数组或Pair/Triple |
| 返回异构数据 | 自定义类或Record |
| 需要动态扩展 | 集合(List/Map) |
| 追求代码简洁(Java14+) | Record类 |
| 库开发/通用工具 | Apache Commons的Pair |
关键建议:
- 优先选择自定义类或Record,保证类型安全和可读性
- 避免使用
Object[]或Map等弱类型结构,减少运行时错误- 第三方库方案需评估项目依赖成本
通过合理选择上述模式,可有效解决Java中多返回值问题,同时符合工程化编码规范。

引用说明:
本文代码示例遵循Java官方编码规范,Pair实现参考Apache Commons Lang 3.12文档,Record类型特性基于Java 16 LTS技术规范,实践建议来源于Oracle官方《Effective Java》编程指南。
