Java функция возвращает поле

Как вернуть Несколько Значений Из Метода Java

Некоторые языки программирования предоставляют простые способы возврата нескольких значений из метода. В Java есть несколько подобных опций, в зависимости от типов.

1. Обзор

В этом уроке мы изучим различные способы возврата нескольких значений из метода Java.

Во-первых, мы вернем массивы и коллекции. Затем мы покажем, как использовать классы контейнеров для сложных данных, и научимся создавать универсальные классы кортежей.

Наконец, мы увидим примеры того, как использовать сторонние библиотеки для возврата нескольких значений.

2. Использование массивов

Массивы могут использоваться для возврата как примитивных, так и ссылочных типов данных .

Например, следующий метод getCoordinates возвращает массив из двух double значений:

double[] getCoordinatesDoubleArray()

Если мы хотим вернуть массив различных ссылочных типов, мы можем использовать общий родительский тип в качестве типа массива :

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

Здесь мы определили координаты массив типа Число , потому что это общий класс между Целочисленными и двойными элементами.

3. Использование коллекций

С помощью общих коллекций Java , мы можем возвращать несколько значений общего типа .

Платформа коллекций имеет широкий спектр классов и интерфейсов. Однако в этом разделе мы ограничимся обсуждением интерфейсов List и Map .

3.1. Возврат значений аналогичного типа в списке

Для начала давайте перепишем предыдущий пример массива с помощью List :

List getCoordinatesList() < Listcoordinates = new ArrayList<>(); coordinates.add(10); // Integer coordinates.add(12.5); // Double return coordinates; >

Как и Number[] , коллекция List содержит последовательность элементов смешанного типа одного и того же общего типа.

3.2. Возврат именованных значений на карте

Если мы хотим назвать каждую запись в нашей коллекции, вместо этого можно использовать Map :

Map getCoordinatesMap() < Mapcoordinates = new HashMap<>(); coordinates.put("longitude", 10); coordinates.put("latitude", 12.5); return coordinates; >

Пользователи метода get Coordinates Map могут использовать ключи ” долгота” или ” широта” с помощью метода Map#get для получения соответствующего значения.

4. Использование Классов Контейнеров

В отличие от массивов и коллекций, контейнерные классы (POJOS) могут обертывать несколько полей с различными типами данных .

Например, следующий класс Координаты имеет два разных типа данных: double и 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 >

Использование контейнерных классов, таких как Координаты , позволяет нам моделировать сложные типы данных со значимыми именами .

Следующим шагом является создание и возврат экземпляра Координат :

Coordinates getCoordinates()

Следует отметить, что рекомендуется создавать классы данных, такие как Координаты |/неизменяемые . Таким образом, мы создаем простые, потокобезопасные, общие объекты.

5. Использование Кортежей

Как и контейнеры, кортежи хранят поля разных типов. Однако они отличаются тем, что не зависят от конкретного приложения .

Они специализированы, когда мы используем их для описания типов, которые мы хотим, чтобы они обрабатывались, но являются контейнером общего назначения с определенным количеством значений. Это означает, что нам не нужно писать пользовательский код, чтобы иметь их, и мы можем использовать библиотеку или создать общую единственную реализацию.

Кортеж может содержать любое количество полей и часто называется Кортеж n, где n – количество полей. Например, Tuple2-это кортеж из двух полей, Tuple3-кортеж из трех полей и так далее.

Чтобы продемонстрировать важность кортежей, рассмотрим следующий пример. Предположим, что мы хотим найти расстояние между точкой Координат и всеми другими точками внутри списка . Затем нам нужно вернуть этот самый удаленный объект координат вместе с расстоянием.

Давайте сначала создадим общий кортеж из двух полей:

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

Далее, давайте реализуем нашу логику и используем экземпляр Tuple2 , чтобы обернуть результаты:

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(); >

Использование Tuple2 Double> в предыдущем примере избавило нас от создания отдельного контейнерного класса для одноразового использования с этим конкретным методом . Double>

Как и контейнеры, кортежи должны быть неизменяемыми . Кроме того, из-за их универсального характера мы должны использовать кортежи внутри, а не как часть нашего публичного API .

6. Сторонние библиотеки

Некоторые сторонние библиотеки реализовали неизменяемый тип Pair или Triple . Apache Commons Lang и javatuples являются примерами. Как только у нас есть эти библиотеки в качестве зависимостей в нашем приложении, мы можем напрямую использовать типы Pair или Triple , предоставляемые библиотеками, вместо того, чтобы создавать их самостоятельно.

Давайте рассмотрим пример использования Apache Commons Lang для возврата объекта Pair или Triple .

Прежде чем мы сделаем следующий шаг, давайте добавим зависимость commons-lang3 в ваш pom.xml:

 org.apache.commons commons-lang3 3.11 

6.1. Неизменяемая пара из Apache Commons Lang

Тип ImmutablePair из Apache Commons Lang-это именно то, что нам нужно: неизменяемый тип, использование которого является простым.

Он содержит два поля: left и right . Давайте посмотрим, как сделать так, чтобы наш метод get Most Distant Point возвращал объект типа ImmutablePair :

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. Неизменяемый пример из Apache Commons Lang

ImmutableTriple очень похож на ImmutablePair . Единственное различие заключается в том, что, как следует из названия, ImmutableTriple содержит три поля: left , middle, и right.

Теперь давайте добавим новый метод к нашему вычислению координат, чтобы показать, как использовать тип ImmutableTriple .

Мы собираемся пройти через все точки в List , чтобы узнать min , avg, и max расстояния до заданной целевой точки.

Давайте посмотрим, как мы можем вернуть три значения с помощью одного метода, используя класс ImmutableTriple :

ImmutableTriple getMinAvgMaxTriple( List coordinatesList, Coordinates target) < ListdistanceList = 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. Заключение

В этой статье мы узнали, как использовать массивы, коллекции, контейнеры и кортежи для возврата нескольких значений из метода. Мы можем использовать массивы и коллекции в простых случаях, поскольку они заключают в себе один тип данных.

С другой стороны, контейнеры и кортежи полезны при создании сложных типов, поскольку контейнеры обеспечивают лучшую читабельность.

Мы также узнали, что некоторые сторонние библиотеки реализовали парные и тройные типы, и увидели несколько примеров из библиотеки Apache Commons Lang.

Как обычно, исходный код этой статьи доступен на GitHub .

Читайте ещё по теме:

Источник

Returning a Value from a Method

You declare a method’s return type in its method declaration. Within the body of the method, you use the return statement to return the value.

Any method declared void doesn’t return a value. It does not need to contain a return statement, but it may do so. In such a case, a return statement can be used to branch out of a control flow block and exit the method and is simply used like this:

If you try to return a value from a method that is declared void , you will get a compiler error.

Any method that is not declared void must contain a return statement with a corresponding return value, like this:

The data type of the return value must match the method’s declared return type; you can’t return an integer value from a method declared to return a boolean.

The getArea() method in the Rectangle Rectangle class that was discussed in the sections on objects returns an integer:

// a method for computing the area of the rectangle public int getArea()

This method returns the integer that the expression width*height evaluates to.

The getArea method returns a primitive type. A method can also return a reference type. For example, in a program to manipulate Bicycle objects, we might have a method like this:

public Bicycle seeWhosFastest(Bicycle myBike, Bicycle yourBike, Environment env) < Bicycle fastest; // code to calculate which bike is // faster, given each bike's gear // and cadence and given the // environment (terrain and wind) return fastest; >

Returning a Class or Interface

If this section confuses you, skip it and return to it after you have finished the lesson on interfaces and inheritance.

When a method uses a class name as its return type, such as whosFastest does, the class of the type of the returned object must be either a subclass of, or the exact class of, the return type. Suppose that you have a class hierarchy in which ImaginaryNumber is a subclass of java.lang.Number , which is in turn a subclass of Object , as illustrated in the following figure .

The class hierarchy for ImaginaryNumber

Now suppose that you have a method declared to return a Number :

public Number returnANumber()

The returnANumber method can return an ImaginaryNumber but not an Object . ImaginaryNumber is a Number because it’s a subclass of Number . However, an Object is not necessarily a Number — it could be a String or another type.

You can override a method and define it to return a subclass of the original method, like this:

public ImaginaryNumber returnANumber()

This technique, called covariant return type, means that the return type is allowed to vary in the same direction as the subclass.

Note: You also can use interface names as return types. In this case, the object returned must implement the specified interface.

Источник

Java функция возвращает поле

Методы могут возвращать некоторое значение. Для этого применяется оператор return .

return возвращаемое_значение;

После оператора return указывается возвращаемое значение, которое является результатом метода. Это может быть литеральное значение, значение переменной или какого-то сложного выражения.

public class Program < public static void main (String args[])< int x = sum(1, 2, 3); int y = sum(1, 4, 9); System.out.println(x); // 6 System.out.println(y); // 14 >static int sum(int a, int b, int c) < return a + b + c; >>

В методе в качестве типа возвращаемого значения вместо void используется любой другой тип. В данном случае метод sum возвращает значение типа int , поэтому этот тип указывается перед названием метода. Причем если в качестве возвращаемого типа для метода определен любой другой, отличный от void , то метод обязательно должен использовать оператор return для возвращения значения.

При этом возвращаемое значение всегда должно иметь тот же тип, что значится в определении функции. И если функция возвращает значение типа int , то после оператора return стоит целочисленное значение, которое является объектом типа int . Как в данном случае это сумма значений параметров метода.

Метод может использовать несколько вызовов оператора return для возваращения разных значений в зависимости от некоторых условий:

public class Program < public static void main (String args[])< System.out.println(daytime(7)); // Good morning System.out.println(daytime(13)); // Good after noon System.out.println(daytime(18)); // Good evening System.out.println(daytime(2)); // Good night >static String daytime(int hour)< if (hour >24 || hour < 0) return "Invalid data"; else if(hour >21 || hour < 6) return "Good night"; else if(hour >= 15) return "Good evening"; else if(hour >= 11) return "Good after noon"; else return "Good morning"; > >

Здесь метод daytime возвращает значение типа String, то есть строку, и в зависимости от значения параметра hour возвращаемая строка будет различаться.

Выход из метода

Оператор return применяется для возвращаения значения из метода, но и для выхода из метода. В подобном качестве оператор return применяется в методах, которые ничего не возвращают, то есть имеют тип void :

public class Program < public static void main (String args[])< daytime(7); // Good morning daytime(13); // Good after noon daytime(32); // daytime(56); // daytime(2); // Good night >static void daytime(int hour)< if (hour >24 || hour < 0) return; if(hour >21 || hour < 6) System.out.println("Good night"); else if(hour >= 15) System.out.println("Good evening"); else if(hour >= 11) System.out.println("Good after noon"); else System.out.println("Good morning"); > >

Если переданное в метод datetime значение больше 24 или меньше 0, то просто выходим из метода. Возвращаемое значение после return указывать в этом случае не нужно.

Источник

Читайте также:  Php узнать сколько дней месяце
Оцените статью