Cara Mengembalikan Pelbagai Nilai Dari Kaedah Java

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan belajar pelbagai cara untuk mengembalikan beberapa nilai dari kaedah Java.

Pertama, kami akan mengembalikan susunan dan koleksi. Kemudian, kami akan menunjukkan cara menggunakan kelas wadah untuk data kompleks dan belajar bagaimana membuat kelas tuple generik.

Akhirnya, kita akan melihat contoh bagaimana menggunakan perpustakaan pihak ketiga untuk mengembalikan banyak nilai.

2. Menggunakan Susun atur

Susunan boleh digunakan untuk mengembalikan kedua-dua jenis data primitif dan rujukan .

Contohnya, kaedah getCoordinates berikut mengembalikan susunan dua nilai berganda :

double[] getCoordinatesDoubleArray() { double[] coordinates = new double[2]; coordinates[0] = 10; coordinates[1] = 12.5; return coordinates; }

Sekiranya kita ingin mengembalikan pelbagai jenis rujukan yang berbeza, kita boleh menggunakan jenis induk biasa sebagai jenis array :

Number[] getCoordinatesNumberArray() { Number[] coordinates = new Number[2]; coordinates[0] = 10; // Integer coordinates[1] = 12.5; // Double return coordinates; }

Di sini kami telah menentukan susunan koordinat jenis Nombor kerana ini adalah kelas umum antara elemen Integer dan Double .

3. Menggunakan Koleksi

Dengan koleksi Java generik, kita dapat mengembalikan beberapa nilai dari jenis yang sama .

Kerangka koleksi mempunyai spektrum kelas dan antara muka yang luas. Walau bagaimanapun, di bahagian ini, kami akan menghadkan perbincangan kami ke antara muka Senarai dan Peta .

3.1. Mengembalikan Nilai Jenis Sejenis dalam Senarai

Sebagai permulaan, mari tulis semula contoh larik sebelumnya menggunakan Senarai :

List getCoordinatesList() { List coordinates = new ArrayList(); coordinates.add(10); // Integer coordinates.add(12.5); // Double return coordinates; }

Seperti Nombor [] , koleksi Senarai mempunyai urutan unsur-unsur jenis campuran semua jenis biasa yang sama.

3.2. Mengembalikan Nilai Dinamakan dalam Peta

Sekiranya kami ingin menamakan setiap entri dalam koleksi kami, Peta boleh digunakan sebagai gantinya:

Map getCoordinatesMap() { Map coordinates = new HashMap(); coordinates.put("longitude", 10); coordinates.put("latitude", 12.5); return coordinates; }

Pengguna kaedah getCoordinatesMap dapat menggunakan kunci " longitud" atau " latitude" dengan kaedah Map # get untuk mendapatkan nilai yang sesuai.

4. Menggunakan Kelas Kontena

Tidak seperti tatasusunan dan koleksi, kelas kontena (POJO) dapat membungkus pelbagai medan dengan pelbagai jenis data .

Sebagai contoh, kelas Koordinat berikut mempunyai dua jenis data yang berbeza, dua dan String :

public class Coordinates { private double longitude; private double latitude; private String placeName; public Coordinates(double longitude, double latitude, String placeName) { this.longitude = longitude; this.latitude = latitude; this.placeName = placeName; } // getters and setters }

Menggunakan kelas kontena seperti Koordinat membolehkan kita memodelkan jenis data yang kompleks dengan nama yang bermakna .

Langkah seterusnya adalah membuat dan mengembalikan contoh Koordinat :

Coordinates getCoordinates() { double longitude = 10; double latitude = 12.5; String placeName = "home"; return new Coordinates(longitude, latitude, placeName); }

Kita harus perhatikan bahawa disarankan agar kita menjadikan kelas data seperti Koordinat tidak berubah . Dengan berbuat demikian, kami membuat objek mudah yang mudah dilekatkan pada benang.

5. Menggunakan Tuples

Seperti bekas, tupel menyimpan ladang pelbagai jenis. Namun, mereka berbeza kerana tidak khusus aplikasi .

Mereka khusus apabila kami menggunakannya untuk menerangkan jenis mana yang kami mahu mereka kendalikan, tetapi merupakan wadah tujuan umum sejumlah nilai. Ini bermaksud kita tidak perlu menulis kod khusus untuk memilikinya, dan kita dapat menggunakan perpustakaan, atau membuat implementasi tunggal yang sama.

Tuple boleh terdiri daripada sebilangan medan dan sering disebut Tuple n, di mana n adalah bilangan medan. Sebagai contoh, Tuple2 adalah tuple dua medan, Tuple3 adalah tuple tiga medan, dan sebagainya.

Untuk menunjukkan kepentingan tupel, mari kita pertimbangkan contoh berikut. Katakan bahawa kita ingin mencari jarak antara titik Koordinat dan semua titik lain di dalam Senarai . Kemudian, kita perlu mengembalikan objek Koordinat yang paling jauh itu, bersama dengan jaraknya.

Mari buat dahulu tupel dua bidang generik:

public class Tuple2 { private K first; private V second; public Tuple2(K first, V second){ this.first = first; this.second = second; } // getters and setters }

Seterusnya, mari kita laksanakan logik kita dan gunakan contoh Tuple2 untuk membungkus hasilnya:

Tuple2 getMostDistantPoint(List coordinatesList, Coordinates target) { return coordinatesList.stream() .map(coor -> new Tuple2(coor, coor.calculateDistance(target))) .max((d1, d2) -> Double.compare(d1.getSecond(), d2.getSecond())) // compare distances .get(); }

Menggunakan Tuple2 dalam contoh sebelumnya telah menyelamatkan kita dari membuat kelas kontena yang berasingan untuk satu kali penggunaan dengan kaedah tertentu ini .

Seperti bekas, tupel tidak boleh berubah . Selain itu, kerana sifatnya yang umum, kita harus menggunakan tupel secara dalaman dan bukan sebagai sebahagian daripada API awam kita .

6. Perpustakaan Pihak Ketiga

Beberapa perpustakaan pihak ketiga telah menerapkan jenis Pair atau Triple yang tidak dapat diubah . Apache Commons Lang dan javatuples adalah contoh utama. Sebaik sahaja kami mempunyai perpustakaan tersebut sebagai pergantungan dalam aplikasi kami, kami secara langsung dapat menggunakan jenis Pair atau Triple yang disediakan oleh perpustakaan dan bukannya membuatnya sendiri.

Mari kita lihat contoh menggunakan Apache Commons Lang untuk mengembalikan objek Pair atau Triple .

Sebelum melangkah lebih jauh, mari tambahkan kebergantungan commons-lang3 di pom.xml kami :

 org.apache.commons commons-lang3 3.9 

6.1. ImmutablePair dari Apache Commons Lang

The ImmutablePair type from Apache Commons Lang is exactly what we want: an immutable type whose usage is straightforward.

It contains two fields: left and right. Let's see how to make our getMostDistantPoint method return an object of the ImmutablePair type:

ImmutablePair getMostDistantPoint( List coordinatesList, Coordinates target) { return coordinatesList.stream() .map(coordinates -> ImmutablePair.of(coordinates, coordinates.calculateDistance(target))) .max(Comparator.comparingDouble(Pair::getRight)) .get(); }

6.2. ImmutableTriple from Apache Commons Lang

The ImmutableTriple is pretty similar to the ImmutablePair. The only difference is, as its name tells, an ImmutableTriple contains three fields: left, middle, and right.

Now, let's add a new method to our coordinates calculation to show how to use the ImmutableTriple type.

We're going to go through all points in a List to find out the min, avg, and max distances to the given target point.

Let's see how can we return the three values with a single method using the ImmutableTriple class:

ImmutableTriple getMinAvgMaxTriple( List coordinatesList, Coordinates target) { List distanceList = coordinatesList.stream() .map(coordinates -> coordinates.calculateDistance(target)) .collect(Collectors.toList()); Double minDistance = distanceList.stream().mapToDouble(Double::doubleValue).min().getAsDouble(); Double avgDistance = distanceList.stream().mapToDouble(Double::doubleValue).average().orElse(0.0D); Double maxDistance = distanceList.stream().mapToDouble(Double::doubleValue).max().getAsDouble(); return ImmutableTriple.of(minDistance, avgDistance, maxDistance); }

7. Conclusion

In this article, we've learned how to use arrays, collections, containers, and tuples to return multiple values from a method. We can use arrays and collections in simple cases since they wrap a single data type.

On the other hand, containers and tuples are useful in creating complex types, with containers offering better readability.

Kami juga mengetahui bahawa beberapa perpustakaan pihak ketiga telah menerapkan jenis pasangan dan tiga dan melihat beberapa contoh dari perpustakaan Apache Commons Lang.

Seperti biasa, kod sumber untuk artikel ini terdapat di GitHub.