您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“Java怎么同時(shí)返回多個(gè)不同類型”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
Java 同時(shí)返回多個(gè)不同類型
前言
首先我們創(chuàng)建一個(gè)2維元組
我們可以利用繼承機(jī)制實(shí)現(xiàn)長度更長的元組
實(shí)例
java return返回多個(gè)值或多種類型的值方法(list;Map)
1、在寫方法的時(shí)候
2、具體思路都在代碼注釋里了
雖然對于這種需求不常用,且比較冷門,但是還是有其存在的價(jià)值,再次做一下整理。我們常用的return語句只允許返回單個(gè)對象,相對的解決辦法就是創(chuàng)建一個(gè)對象,用它來持有想要返回的多個(gè)對象。
實(shí)現(xiàn)這種功能,還要?dú)w功于Java1.5的新特性-泛型,我們利用泛型,可以一次性地解決該問題,以后再也不用在這個(gè)問題上浪費(fèi)時(shí)間了,并且,我們可以再編譯期就能夠確保類型安全。
你也許已經(jīng)想到使用集合可以實(shí)現(xiàn)我們的需求,但是雖然一次可以返回多個(gè)值,但是其類型都是相同的,并不完全符合我們的需求。
我們需要引入一個(gè)概念:元組(tuple),元組也稱為數(shù)據(jù)傳送對象或信使。元組是將一組對象直接打包存儲于其中的一個(gè)單一對象,這個(gè)容器對象允許讀取其中元素,但是不允許向其中存放新的對象。
通常,元組可以具有任意長度,同時(shí)元組中的對象可以是任意不同的類型。我們能夠?yàn)槊恳粋€(gè)對象指明其類型,并且可以正確讀取到數(shù)據(jù),這就是元組可以提供的功能。我們要處理不同長度的問題,需要?jiǎng)?chuàng)建多個(gè)不同的元組。
//: 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 + ")"; } }
構(gòu)造器捕獲了要存儲的對象,而toString()方法是一個(gè)便利函數(shù),用來顯示列表中的值。
注意:元組隱含地保持了其中元素的次序。
閱讀上面的代碼,以及根據(jù)元組的定義,你一定會(huì)感到詫異,設(shè)計(jì)思路不是應(yīng)該將first和second聲明為private,然后生成這兩個(gè)變量的get方法嗎?
以上是我們大多數(shù)人的思維,但是我們仔細(xì)分析上面的代碼,可以發(fā)現(xiàn)完全符合我們的要求。首先我們可以讀取first和second,并且因?yàn)槭褂昧薴inal聲明,我們就無法在修改其值。我們對比這兩種寫法,很顯然,上面給出的代碼更加合理,更加簡潔明了。
還有另一種設(shè)計(jì)考慮,即你確實(shí)希望允許客戶端程序員改變first或second所引用的對象。然而,采用上面的形式無疑是更安全的做法,這樣的話,如果程序員想要使用具有不同元素的元組,就強(qiáng)制要求他們另外創(chuàng)建一個(gè)新的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 + ")"; } }
為了使用元組,你只需定義一個(gè)長度適合的元組,將其作為方法的返回值,然后在return語句中創(chuàng)建該元組,并返回即可。
//: 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()); } }
輸出結(jié)果:
(hi, 47)
(Amphibian@15db9742, hi, 47)
(Vehicle@6d06d69c, Amphibian@7852e922, hi, 47)
(Vehicle@4e25154f, Amphibian@70dea4e, hi, 47, 11.1)
由于有了泛型,你可以很容易地創(chuàng)建元組,令其返回一組任意類型的對象。而你所要做的,只是編寫表達(dá)式而已。
通過ttsi.first = "there";語句的錯(cuò)誤,我們可以看出,final聲明確實(shí)能夠保護(hù)public元素,在對象被構(gòu)造出來之后,聲明為final的元素便不能被再賦予其他值了。
有時(shí)候需要返回多個(gè)值,有時(shí)候返回的多個(gè)值的類型還不同,依據(jù)不同情況以下提供了三種方法返回多個(gè)值。
如果返回的多個(gè)值類型相同,可以用方法一和方法二;如果返回的多個(gè)值類型不同,可以用方法三。
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,一個(gè)Map只能有一種數(shù)據(jù)類型 public static Map<String, Integer> returnMap(){ Map<String,Integer> map = new HashMap<>(); map.put("age",1); //”age“是key,類似于索引,1是索引對應(yīng)的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:一次性返回兩種類型的數(shù)據(jù),結(jié)合了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結(jié)束\n"); //返回Map,一個(gè)Map只能有一種數(shù)據(jù)類型 Map<String,Integer> mapTest = returnMap(); System.out.println("age = " + mapTest.get("age") +", high = " + mapTest.get("high") + "\nreturnMap結(jié)束\n"); //一次性返回兩種類型的數(shù)據(jù),結(jié)合了Map和list List<Map> list2 = returnMapList(); System.out.println(list2.get(0) +" , " + list2.get(1) + "\nreturnMapList結(jié)束");//list2.get(1)是數(shù)組的地址 System.out.print("調(diào)用返回的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"))); //調(diào)用過程也可以這樣寫 } }
“Java怎么同時(shí)返回多個(gè)不同類型”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。