在开发过程中,经常会有这种情况,就是一个函数需要返回多个值,这是一个问题!!

网上这个问题的解决方法:

1、【使用集合类使用map返回值;这个方法问题是,你并不知道如何返回值的key是什么,只能通过doc或者通过源代码来查看。

2、【使用引用传递传入一个引用进去,修改引用的属性值。问题:不实用。

3、【使用封装对象通过泛型构造一个类似python的tuple类,或者构造一个JavaBean,其问题都是“一次性”,觉的不优雅。

import java.util.HashMap;
import java.util.Map;
public class Test {
    /**
     * 方法1:使用集合类 (Map以外的集合类也可以随意使用)
     * 目标:返回一个数组的最大值和最小值
     */
    public Map<String, Integer> test1(int[] arr) {
        Map<String, Integer> map = new HashMap<String, Integer>();
        int max = Integer.MIN_VALUE;
        int min = Integer.MAX_VALUE;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
            if (arr[i] < min) {
                min = arr[i];
            }
        }
        map.put("max", max);
        map.put("min", min);
        return map;
    }
    /**
     * 方法2:使用封装对象
     * 目标:返回一个数组的最大值和最小值
     */
    public Result test2(int[] arr) {
        Result result = new Result();
        int max = Integer.MIN_VALUE;
        int min = Integer.MAX_VALUE;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
            if (arr[i] < min) {
                min = arr[i];
            }
        }
        result.setMax(max);
        result.setMin(min);
        return result;
    }
    /**
     * 方法3:使用引用传递 (不适用基本类型及其封装类和String类型)
     * 目标:返回数组长度,同时获取最大值和最小值
     */
    public int test3(int[] arr, Result result) {
        int max = Integer.MIN_VALUE;
        int min = Integer.MAX_VALUE;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
            if (arr[i] < min) {
                min = arr[i];
            }
        }
        result.setMax(max);
        result.setMin(min);
        int total = arr.length;
        return total;
    }
    
    /**
     * 测试main
     */
    public static void main(String[] args) {
        Test t = new Test();
        int[] arr = { 1, 2, 3, 4, 5, 6 };
        
        // ----------方法1测试-----------
        // Map<String, Integer> map = t.test1(arr);
        // System.out.println("max : " + map.get("max"));
        // System.out.println("min : " + map.get("min"));
        // ----------方法2测试-----------
        // Result result = t.test2(arr);
        // System.out.println("max : " + result.getMax());
        // System.out.println("min : " + result.getMin());
        // ----------方法3测试-----------
        Result result = new Result();
        int total = t.test3(arr, result);
        System.out.println("total : " + total);
        System.out.println("max : " + result.getMax());
        System.out.println("min : " + result.getMin());
    }
}
class Result {
    int max;
    int min;
    // 构造函数
    public Result() {
        super();
    }
    // getters/setters(略)
}

个人解决方案:

  • 使用EnumMap作为返回值类型,自己定义一个enum,将可能返回的属性名定义为enum取值即可。
package com.cy;
import java.util.EnumMap;
/**
 * Created by on 2014/7/10.
 */
public interface TestService {
    enum UserInfoProperty {
        ROOM,CELLPHONE,Name
    }
    public EnumMap<UserInfoProperty,Object> getUserInfoByName(String name);
}

  • 实现类
public class TestServiceImpl implements TestService {
    @Override
    public EnumMap<UserInfoProperty, Object> getUserInfoByName(String name) {
        EnumMap<UserInfoProperty,Object> retMap = new EnumMap<UserInfoProperty, Object>(UserInfoProperty.class);
        retMap.put(UserInfoProperty.ROOM,"0003");
        retMap.put(UserInfoProperty.CELLPHONE,"00004");
        retMap.put(UserInfoProperty.Name,name);
        return retMap;
    }
}

  • main入口

ublic class App 
{
    public static void main( String[] args )
    {
        TestService testService = new TestServiceImpl();
        String name = "testName";
        EnumMap<TestService.UserInfoProperty,Object> userInfo = testService.getUserInfoByName(name);
         userInfo.entrySet().iterator();
        System.out.println(userInfo.get(TestService.UserInfoProperty.Name));
        System.out.println(userInfo.get(TestService.UserInfoProperty.ROOM));
        System.out.println(userInfo.get(TestService.UserInfoProperty.CELLPHONE));
    }
}

补充:EnumMap

什么是EnumMap

  • 补充说明
  • 简单示例

以下内容基于jdk1.7.0_79源码;

什么是EnumMap

Map接口的实现,其key-value映射中的key是Enum类型;


补充说明

其原理就是一个对象数组,数组的下标索引就是根据Map中的key直接获取,即枚举中的ordinal值;

效率比HashMap高,可以直接获取数组下标索引并访问到元素;


简单示例

比较简单,源代码就不一一添加注释了,简单地说,就是一个对象数组;

这里稍微了解一下怎么使用就好了,下面列出一些方法的调用示例:

package com.pichen.collection;

import java.util.EnumMap;
import java.util.Map;
import java.util.Map.Entry;

enum Operate{
    ADD, UPDATE, DELETE; 
}

public class Main {

    public static void main(String[] args) {
        Map<Operate, String> map = new EnumMap<Operate, String>(Operate.class);


        //put方法
        map.put(Operate.ADD, "add operate");
        map.put(Operate.UPDATE, "update operate");
        map.put(Operate.DELETE, "delete operate");
        
        //重写了toString方法
        System.out.println(map);
        
        //size方法
        System.out.println(map.size());
        
        System.out.println(map.containsKey(Operate.UPDATE));
        System.out.println(map.containsValue("update operate"));
        System.out.println(map.get(Operate.DELETE));
        
        //remove
        map.remove(Operate.UPDATE);
        System.out.println(map);
        
        //key集合
        for(Operate operate:map.keySet()){
            System.out.print(operate + " ");
        }
        
        System.out.println();
        //value集合
        for(String obj:map.values()){
            System.out.print(obj + ",");
        }
        
        System.out.println();
        //key-value集合
        for(Entry<Operate, String> entry:map.entrySet()){
            System.out.print(entry.getKey() + ": " + entry.getValue() + ", ");
        }

    }
}

输出结果:

{ADD=add operate, UPDATE=update operate, DELETE=delete operate}
 3
 true
 true
 delete operate
 {ADD=add operate, DELETE=delete operate}
 ADD DELETE 
 add operate,delete operate,
 ADD: add operate, DELETE: delete operate,