广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java 如何同时返回多个不同类型
  • 230
分享到

Java 如何同时返回多个不同类型

2024-04-02 19:04:59 230人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录Java 同时返回多个不同类型前言首先我们创建一个2维元组我们可以利用继承机制实现长度更长的元组实例java return返回多个值或多种类型的值方法(list;Map)1、在写

Java 同时返回多个不同类型

前言

虽然对于这种需求不常用,且比较冷门,但是还是有其存在的价值,再次做一下整理。我们常用的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",
    47);
 }
 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 return返回多个值或多种类型的值方法(list;Map)

1、在写方法的时候

有时候需要返回多个值,有时候返回的多个值的类型还不同,依据不同情况以下提供了三种方法返回多个值。

2、具体思路都在代码注释里了

如果返回的多个值类型相同,可以用方法一和方法二;如果返回的多个值类型不同,可以用方法三。


import java.util.*;
public class Demo { 
    //方法1:返回list
    public static List<int[]> returnList(){
        List<int[]> list=new ArrayList<>();
        list.add(new int[]{1});
        list.add(new int[]{1, 2});
        list.add(new int[]{1, 2, 3});
        return list;
    }
 
    //方法2:返回Map,一个Map只能有一种数据类型
    public static Map<String, Integer> returnMap(){
        Map<String,Integer> map = new HashMap<>();
        map.put("age",1);  //”age“是key,类似于索引,1是索引对应的int值
        map.put("high",30);
        //System.out.println(map.get("age"));
        Map<String,int[]> map1 = new HashMap<>();
        map1.put("array", new int[]{1, 2, 3});
        //System.out.println(Arrays.toString(  map1.get("array") ));
        return map;
    }
 
    //方法3:一次性返回两种类型的数据,结合了Map和list
    public static List<Map> returnMapList(){
        Map<String,Integer> map = new HashMap<>();
        map.put("age",1);
        map.put("high",30);
        Map<String,int[]> map1 = new HashMap<>();
        map1.put("array", new int[]{1, 2});
        List<Map> listMap = new ArrayList<Map>();
        listMap.add(map);
        listMap.add(map1);
        return listMap; 
    } 
 
//测试代码
    public static void main(String[] args){
        //返回list
        List<int[]> list1 = returnList();
        System.out.println(Arrays.toString(list1.get(0)) + Arrays.toString(list1.get(1)) + Arrays.toString(list1.get(2)) + "\nreturnlist结束\n");
 
        //返回Map,一个Map只能有一种数据类型
        Map<String,Integer> mapTest = returnMap();
        System.out.println("age = " + mapTest.get("age") +",   high = " + mapTest.get("high") +  "\nreturnMap结束\n");
 
        //一次性返回两种类型的数据,结合了Map和list
        List<Map> list2 = returnMapList();
        System.out.println(list2.get(0)  +" , " + list2.get(1)  + "\nreturnMapList结束");//list2.get(1)是数组的地址
        System.out.print("调用返回的int和int[]:");
        Map map0 = list2.get(0);
        Map map1 = list2.get(1);
        System.out.println( "age = " + map0.get("age") );
        System.out.println("array = " + Arrays.toString((int[]) map1.get("array")));
//      System.out.println(Arrays.toString((int[]) list2.get(1).get("array")));   //调用过程也可以这样写
    }
}
 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Java 如何同时返回多个不同类型

本文链接: https://www.lsjlt.com/news/133479.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java 如何同时返回多个不同类型
    目录Java 同时返回多个不同类型前言首先我们创建一个2维元组我们可以利用继承机制实现长度更长的元组实例java return返回多个值或多种类型的值方法(list;Map)1、在写...
    99+
    2022-11-12
  • Java中为什么不同的返回类型不算方法重载
    目录为什么不同返回类型不算方法重载?方法重载的使用场景方法重载匹配原则匹配原则1:精准类型匹配匹配原则2:基本类型自动转换成更大的基本类型匹配原则3:自动装/拆箱匹配匹配原则4:按照...
    99+
    2022-11-15
    Java返回类型 Java方法重载
  • Springboot如何同时装配两个相同类型数据库
    目录同时装配两个相同类型数据库配置连接两个或多个数据库同时装配两个相同类型数据库 1.配置文件: spring: profiles: active: dev ...
    99+
    2022-11-12
  • php如何比较两个数组并返回不同元素
    这篇文章主要介绍了php如何比较两个数组并返回不同元素的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇php如何比较两个数组并返回不同元素文章都会有所收获,下面我们一起来看看吧。比较方法:1、用“array_di...
    99+
    2023-06-30
  • Mybatis怎么传递多个不同类型的参数
    这篇文章主要介绍了Mybatis怎么传递多个不同类型的参数的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Mybatis怎么传递多个不同类型的参数文章都会有所收获,下面我们一起来看看吧。Mybatis传递多个不同...
    99+
    2023-07-05
  • Mybatis(ParameterType)传递多个不同类型的参数方式
    目录Mybatis传递多个不同类型的参数基于注解Mybatis传递单个String类型的参数总结Mybatis传递多个不同类型的参数 在一些场景下,传参是需要多个参数的。一个参数不太...
    99+
    2023-05-14
    Mybatis ParameterType Mybatis传递不同类型参数 Mybatis传递参数
  • 如何解决js相同正则多次调用test()返回的值却不同的问题
    这篇文章主要为大家展示了“如何解决js相同正则多次调用test()返回的值却不同的问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决js相同正则多次调用...
    99+
    2022-10-19
  • css如何同时使用两个类
    小编给大家分享一下css如何同时使用两个类,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!同时使用两个类一般只能给一个元素设定一个...
    99+
    2022-10-19
  • python函数如何返回一个对象类型
    python使用range函数返回对象类型,具体方法如下:range函数语法:range(start, stop[, step])range函数使用方法:print(range(10))range(0,10)...
    99+
    2022-10-05
  • Java 中如何响应不同数据类型的文件?
    在开发 Java 应用程序时,我们可能会遇到需要响应不同数据类型的文件的情况。例如,我们可能需要响应图片文件、PDF 文件、文本文件等等。在本文中,我们将介绍如何使用 Java 响应不同数据类型的文件。 响应图片文件 在 Java 中...
    99+
    2023-10-24
    响应 数据类型 文件
  • python如何计算不同类型变量
    这篇文章主要讲解了“python如何计算不同类型变量”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python如何计算不同类型变量”吧!说明数字变量可以直接计算。若变量为bool型,则计算时...
    99+
    2023-06-20
  • 如何在PHP中同步不同数据类型的日志?
    在PHP应用程序中,日志记录是非常重要的一部分。日志记录可以帮助开发人员更好地了解应用程序的运行情况,以及如何优化应用程序的性能。然而,在实际的应用程序中,可能需要记录多种类型的日志信息,比如系统日志、错误日志、调试日志等等。这些日志信息...
    99+
    2023-06-08
    日志 数据类型 同步
  • Python中的实时数据类型与其他数据类型有何不同?
    Python是一种强大的编程语言,它支持多种数据类型。其中,实时数据类型是Python中的一种特殊类型,与其他数据类型有着明显的不同。在本文中,我们将探讨Python中的实时数据类型和其他数据类型的区别,并演示一些实用的代码示例。 实时数...
    99+
    2023-10-23
    对象 实时 数据类型
  • 如何在Java中使用不同的数据类型?哪个框架可以帮助你实现同步?
    Java是一门十分流行的编程语言,它支持多种数据类型,包括基本数据类型和引用数据类型。在Java中使用不同的数据类型是非常重要的,因为不同的数据类型适用于不同的场景。同时,Java中也有很多框架可以帮助你实现同步。在本文中,我们将深入探讨如...
    99+
    2023-09-13
    数据类型 框架 同步
  • vue如何在多个不同服务器下访问不同地址
    目录一、前言二、实现思路三、实践1. 获取axios请求地址2. 配置不同服务器的地址3. 打包时根据 process.env.NODE_ENV 判断不同环境4....
    99+
    2022-11-13
  • JavaScript如何同时合并多个对象
    这篇文章主要为大家展示了“JavaScript如何同时合并多个对象”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript如何同时合并多个对象”这篇文...
    99+
    2022-10-19
  • springboot之如何同时连接多个redis
    目录技术选型 Springboot连接reids的三个客户端代码部分maven pom引用application.yml配置Configuration代码启动失败日志启动成...
    99+
    2023-05-16
    springboot连接多个redis springboot连接redis springboot redis
  • 如何在 Java 中处理不同类型的文件响应?
    Java 是一种广泛使用的编程语言,它的应用场景非常广泛。在 Java 中,我们经常需要处理各种不同类型的文件响应。本文将介绍如何在 Java 中处理不同类型的文件响应。 Java 中处理不同类型的文件响应可以使用 Java 文件处理类库。...
    99+
    2023-10-24
    响应 数据类型 文件
  • Java IDE开发技术:如何应对不同数据类型?
    Java是一种面向对象的编程语言,拥有强大的数据类型支持,包括基本数据类型和引用数据类型。在Java IDE开发中,如何应对不同的数据类型是一个非常重要的话题。在本文中,我们将深入探讨Java IDE开发技术中如何应对不同数据类型的问题。 ...
    99+
    2023-08-28
    ide 开发技术 数据类型
  • Python不同数据类型间如何转换
    这篇文章主要介绍了Python不同数据类型间如何转换的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python不同数据类型间如何转换文章都会有所收获,下面我们一起来看看吧。字符串与数字类型的转换什么是类型转换?...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作