添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

前言:虽然对于这种需求不常用,且比较冷门,但是还是有其存在的价值,再次做一下整理。我们常用的return语句只允许返回单个对象,相对的解决办法就是创建一个对象,用它来持有想要返回的多个对象。

实现这种功能,还要归功于Java1.5的新特性-泛型,我们利用泛型,可以一次性地解决该问题,以后再也不用在这个问题上浪费时间了,并且,我们可以再编译期就能够确保类型安全。

你也许已经想到使用集合可以实现我们的需求,但是虽然一次可以返回多个值,但是其类型都是相同的,并不完全符合我们的需求。

我们需要引入一个概念:元组(tuple),元组也称为数据传送对象或信使。 元组是将一组对象直接打包存储于其中的一个单一对象,这个容器对象允许读取其中元素,但是不允许向其中存放新的对象。

通常,元组 可以具有任意长度 ,同时元组中的对象 可以是任意不同的类型 。我们能够为每一个对象指明其类型,并且可以正确读取到数据,这就是元组可以提供的功能。我们要处理不同长度的问题,需要创建多个不同的元组。

首先我们创建一个2维元组:

//: net/mindview/util/TwoTuple.java(Java编程思想_代码_目录)
package net.mindview.util;
public class TwoTuple<A, B> {
	public final A first;
	public final B second;
	public TwoTuple(A a, B b) {
		first = a;
		second = b;
	public String toString() {
		return "(" + first + ", " + second + ")";

构造器捕获了要存储的对象,而toString()方法是一个便利函数,用来显示列表中的值。

注意:元组隐含地保持了其中元素的次序。

  阅读上面的代码,以及根据元组的定义,你一定会感到诧异,设计思路不是应该将first和second声明为private,然后生成这两个变量的get方法吗?
  以上是我们大多数人的思维,但是我们仔细分析上面的代码,可以发现完全符合我们的要求。首先我们可以读取first和second,并且因为使用了final声明,我们就无法在修改其值。我们对比这两种写法,很显然,上面给出的代码更加合理,更加简洁明了。

  还有另一种设计考虑,即你确实希望允许客户端程序员改变first或second所引用的对象。然而,采用上面的形式无疑是更安全的做法,这样的话,如果程序员想要使用具有不同元素的元组,就强制要求他们另外创建一个新的TwoTuple对象。

我们可以利用继承机制实现长度更长的元组:

//: net/mindview/util/ThreeTuple.java
package net.mindview.util;
public class ThreeTuple<A,B,C> extends TwoTuple<A,B> {
  public final C third;
  public ThreeTuple(A a, B b, C c) {
    super(a, b);
    third = c;
  public String toString() {
    return "(" + first + ", " + second + ", " + third +")";
//: net/mindview/util/FourTuple.java
package net.mindview.util;
public class FourTuple<A,B,C,D> extends ThreeTuple<A,B,C> {
  public final D fourth;
  public FourTuple(A a, B b, C c, D d) {
    super(a, b, c);
    fourth = d;
  public String toString() {
    return "(" + first + ", " + second + ", " +
      third + ", " + fourth + ")";
//: net/mindview/util/FiveTuple.java
package net.mindview.util;
public class FiveTuple<A,B,C,D,E>
extends FourTuple<A,B,C,D> {
  public final E fifth;
  public FiveTuple(A a, B b, C c, D d, E e) {
    super(a, b, c, d);
    fifth = e;
  public String toString() {
    return "(" + first + ", " + second + ", " +
      third + ", " + fourth + ", " + fifth + ")";

为了使用元组,你只需定义一个长度适合的元组,将其作为方法的返回值,然后在return语句中创建该元组,并返回即可。

//: generics/TupleTest.java
import net.mindview.util.*;
class Amphibian {
class Vehicle {
public class TupleTest {
	static TwoTuple<String, Integer> f() {
		// Autoboxing converts the int to Integer:
		return new TwoTuple<String, Integer>("hi", 47);
	static ThreeTuple<Amphibian, String, Integer> g() {
		return new ThreeTuple<Amphibian, String, Integer>(new Amphibian(), "hi",
	static FourTuple<Vehicle, Amphibian, String, Integer> h() {
		return new FourTuple<Vehicle, Amphibian, String, Integer>(new Vehicle(),
				new Amphibian(), "hi", 47);
	static FiveTuple<Vehicle, Amphibian, String, Integer, Double> k() {
		return new FiveTuple<Vehicle, Amphibian, String, Integer, Double>(
				new Vehicle(), new Amphibian(), "hi", 47, 11.1);
	public static void main(String[] args) {
		TwoTuple<String, Integer> ttsi = f();
		System.out.println(ttsi);
		// ttsi.first = "there"; // Compile error: final
		System.out.println(g());
		System.out.println(h());
		System.out.println(k());

输出结果:

(hi, 47)
(Amphibian@15db9742, hi, 47)
(Vehicle@6d06d69c, Amphibian@7852e922, hi, 47)
(Vehicle@4e25154f, Amphibian@70dea4e, hi, 47, 11.1)

  由于有了泛型,你可以很容易地创建元组,令其返回一组任意类型的对象。而你所要做的,只是编写表达式而已。

  通过ttsi.first = "there";语句的错误,我们可以看出,final声明确实能够保护public元素,在对象被构造出来之后,声明为final的元素便不能被再赋予其他值了。

参考资料:

  • 《Java编程思想》
Java方法】从方法返回多个值 (1)java方法只能返回一个值,但是在实际需求中经常遇到一个方法返回多个值,这是该如何操作? 思路:可以量多个值装到字典(Map)中,将字典作为一个值返回。 (2)举例实现 假设一个方法需要返回两个二维数组 import java.util.*; public class MapReturn { //将两个数组通过Map返回 public static M...
java定义通用返回结果类ResultVO使用示例详解定义通用返回结果类定义ResultVO类,作返回给前端的对象结构,主要有4个字段code : 错误码data : 内容message : 消息description : 具体描述登录后复制 import lombok.Data; import java.io.Seri...
java中return多个或者多种类型的值的方法(list;Map) 1.在写方法的时候,有时候需要返回多个值,有时候返回多个值的类型不同,依据不同情况以下提供了三种方法返回多个值。 2.具体思路都在代码注释里了。如果返回多个类型相同,可以用方法一和方法二;如果返回多个类型不同,可以用方法三。 初试写作,略感激动。 import java.util.*; public class Demo { //方法1:返回list public static List<i
本文翻译自:https://www.baeldung.com/java-method-return-multiple-values#:~:text=%20How%20to%20Return%20Multiple%20Values%20From%20a,multiple%20values%20of%20a…%204%20Conclusion%20More%20 文章目录1.概览2.使用数组3.使用collections3.1 用List返回相似类型的值3.2 用Map返回命名值4.使用容器类5.使用元组6.第
也想知道函数处理的数据,这是我们就需要使用多个返回值。但是java中不支持in,out方式的参数 如我们在获得用户信息时使用 int getUserInfo(String username,String password,UserInfo userinfo); 我们在getserInfo函数中返回值需要的是返回处理状态,其中我们可以通过userinfo来知道获得的数据,虽然我们直接使用 userinfo的相关set方法将数据保存到userinfo对象中,一般如果不重新生成对象,我们可以将值正确返回. 但是在hibernate等数据库访问时,我们却无法获得userinfo对象。原因就是java 使用的是对象传递. 那么怎么解决返回多个参数值呢? 解决方式就是用HashMap来保存返回的结果.这样就可以解决多个返回值的问题
在我们写代码的时候,肯定会遇到要返回两个值,但是这两个值都有用到,所以我们一般都会用map集合进行key-value封装,或者写一个类来封装两个属性来返回,这两种方式虽然实现起来简单,但是感觉有点浪费类或者不美观,如果大量的出现这种,就大量创建类或者map集合。原因是Java方法函数对于多个返回参数的选项是有限制的,一种方法只能返回一个对象,数组或原始函数,而且和其他语言不同的是它也不会提供一种简易方式来消耗方法调用中的参数。 于是我们选择返回一个对象数组,一个集合,仅为返回的参数创建...