Get: примеры (JAVA)
get(int index): EОбщее назначение и варианты метода get в Java
В Java слово get чаще всего встречается как часть имени метода и обозначает операцию извлечения значения: геттеры полей, доступ к элементам коллекций и получение системных или конфигурационных свойств. Конкретное поведение зависит от API. Ниже описаны самые распространённые варианты с аргументами и возвращаемыми значениями.
- Getter (POJO): метод вида
public Тип getX(). Аргументы отсутствуют. Возвращает значение поля или вычисленное представление. Может возвращатьnullдля ссылочных типов. - java.util.Map.get(K key): аргумент - ключ
keyтипаK. Возвращает значениеV, связанное с ключом, илиnull, если ключа нет или значение было явно установлено вnull. Для отличия отсутствующего ключа часто используютсяcontainsKeyилиgetOrDefault. - java.util.Map.getOrDefault(K key, V defaultValue): возвращает значение для ключа или переданный
defaultValue, если ключ отсутствует. - java.util.List.get(int index): аргумент - индекс. Возвращает элемент на позиции
index. При некорректном индексе бросаетIndexOutOfBoundsException. - java.util.Optional.get(): аргументов нет. Возвращает содержимое Optional; при пустом Optional бросает
NoSuchElementException. Часто предпочтительнее использовать безопасные альтернативы:orElse,orElseGet,orElseThrow,ifPresent. - java.util.Properties.getProperty(String key) и System.getProperty(String key): принимают имя свойства. Возвращают значение как строку или
null, если свойство не найдено; уgetPropertyесть перегрузка с дефолтом.
Типы исключений и поведение при null зависят от конкретного метода. При реализации геттеров в классах рекомендуется документировать, может ли метод возвращать null.
Короткие примеры различных вариантов get
Map.get и getOrDefault
import java.util.*;
class E1 {
public static void main(String[] args) {
Map m = new HashMap<>();
m.put("a", "alpha");
System.out.println(m.get("a"));
System.out.println(m.get("b"));
System.out.println(m.getOrDefault("b", "default"));
}
}
alpha null default
List.get с индексом
import java.util.*;
class E2 {
public static void main(String[] args) {
List l = Arrays.asList(10,20,30);
System.out.println(l.get(1));
}
}
20
Optional.get (опасный вариант)
import java.util.*;
class E3 {
public static void main(String[] args) {
Optional o = Optional.of("val");
System.out.println(o.get());
Optional empty = Optional.empty();
// следующий вызов бросит исключение
// System.out.println(empty.get());
}
}
val
Геттер в классе (POJO)
class Person {
private String name;
public Person(String name) { this.name = name; }
public String getName() { return name; }
}
class E4 {
public static void main(String[] args) {
System.out.println(new Person("Ivan").getName());
}
}
Ivan
Properties.getProperty
import java.util.*;
class E5 {
public static void main(String[] args) {
Properties p = new Properties();
p.setProperty("k", "v");
System.out.println(p.getProperty("k"));
System.out.println(p.getProperty("x", "def"));
}
}
v def
Похожие методы в Java и их отличия
- getOrDefault - возвращает дефолт вместо
null, когда ключ отсутствует. Предпочтительнее при желании избежатьnull. - computeIfAbsent - вычисляет и сохраняет значение при отсутствии ключа; удобен для ленивой инициализации кэшей.
- containsKey - проверяет наличие ключа, полезен когда
nullможет быть допустимым значением. - orElse / orElseGet / orElseThrow для Optional - более безопасные альтернативы
get(). - Records (Java 16 и выше) - вместо традиционных геттеров используются авто-сгенерированные аксессоры с именами полей; предпочтительны для неизменяемых данных.
Аналоги в других языках и их особенности
Краткие примеры поведения, аналогичного Map.get или геттерам, в популярных языках.
JavaScript (Map)
const m = new Map([["a","alpha"]]);
console.log(m.get("a"));
console.log(m.get("b"));
alpha undefined
Python (dict.get)
d = {"a": "alpha"}
print(d.get("a"))
print(d.get("b"))
print(d.get("b", "default"))
alpha None default
PHP (массивы)
$a = ["a" => "alpha"];
echo $a["a"]."\n";
echo ($a["b"] ?? "default")."\n";
alpha default
C# (Dictionary TryGetValue)
using System;
using System.Collections.Generic;
class P{
static void Main(){
var d = new Dictionary{{"a","alpha"}};
if(d.TryGetValue("a", out var v)) Console.WriteLine(v);
Console.WriteLine(d.ContainsKey("b") ? d["b"] : "default");
}
}
alpha default
Go (map lookup)
package main
import "fmt"
func main(){
m := map[string]string{"a":"alpha"}
v, ok := m["a"]
fmt.Println(v, ok)
v, ok = m["b"]
fmt.Println(v, ok)
}
alpha true false
Kotlin (Map.get и свойства)
fun main(){
val m = mapOf("a" to "alpha")
println(m["a"]) // аналог get
println(m.getOrDefault("b","def"))
}
alpha def
SQL (SELECT)
-- Получение значения по ключу в таблице
SELECT value FROM table WHERE key = 'a';
(зависит от данных в таблице)
Особенности: в языках без null-safety поведение при отсутствии элемента чаще возвращает null или undefined, в языках с явными конструкциями (Python dict.get, C# TryGetValue, Go - проверка ok) существует явное разделение между «нет значения» и «значение null/пусто».
Типичные ошибки при использовании get и примеры
- Непонимание возвращаемого null от Map.get. Код:
Map m = new HashMap<>();
String v = m.get("x");
int len = v.length(); // NPE если v == null
Exception in thread "main" java.lang.NullPointerException
at ...
- IndexOutOfBounds при List.get. Код:
List l = Arrays.asList(1,2);
System.out.println(l.get(2));
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
at ...
- Optional.get на пустом Optional. Код:
Optional o = Optional.empty();
System.out.println(o.get());
Exception in thread "main" java.util.NoSuchElementException: No value present
at java.util.Optional.get(Optional.java:...)
- Ошибки приведения типов после извлечения из коллекций с необобщённым типом. Код:
List raw = new ArrayList();
raw.add("str");
Integer x = (Integer) raw.get(0); // ClassCastException
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at ...
Рекомендации по предотвращению ошибок: проверять containsKey либо использовать getOrDefault, избегать Optional.get() без проверки, корректно обрабатывать индексы и применять generics.
Изменения, влияющие на поведение методов get в последних версиях Java
- Java 8: введён
Optional,Map.getOrDefault,computeIfAbsent, что изменило подходы к получению и инициализации значений. - Java 9+ и далее: эволюция API коллекций не затронула семантику
Map.getиList.get, но появились новые фабричные методы для создания коллекций (List.of,Map.of), что меняет подходы к неизменяемым структурам. - Java 16: records добавили синтаксические аксессоры вместо привычных геттеров для иммутабельных типов.
Продвинутые и редкие сценарии использования get
Кэширование с использованием computeIfAbsent
import java.util.concurrent.*;
import java.util.*;
class Adv1{
static final ConcurrentMap> cache = new ConcurrentHashMap<>();
static List load(String key){
// имитация тяжёлой загрузки
return Arrays.asList(key+"-1", key+"-2");
}
public static void main(String[] args){
List v = cache.computeIfAbsent("k", Adv1::load);
System.out.println(v);
// последующие вызовы вернут уже сохранённый результат
System.out.println(cache.get("k") == v);
}
}
[k-1, k-2] true
Использование getter-методов в Stream API (метод ссылка)
import java.util.*;
import java.util.stream.*;
class Person{ private String name; Person(String n){name=n;} public String getName(){return name;} }
class Adv2{
public static void main(String[] args){
List ppl = Arrays.asList(new Person("A"), new Person("B"));
List names = ppl.stream().map(Person::getName).collect(Collectors.toList());
System.out.println(names);
}
}
[A, B]
Вызов геттера через Java Beans Introspector
import java.beans.*;
import java.lang.reflect.*;
class Bean{ private int x=42; public int getX(){return x;} }
class Adv3{
public static void main(String[] args) throws Exception{
Bean b = new Bean();
for(PropertyDescriptor pd : Introspector.getBeanInfo(Bean.class).getPropertyDescriptors()){
if("x".equals(pd.getName())){
Method getter = pd.getReadMethod();
System.out.println(getter.invoke(b));
}
}
}
}
42
Комбинация Optional и Map.get для безопасного извлечения
import java.util.*;
class Adv4{
public static void main(String[] args){
Map m = new HashMap<>();
m.put("a","alpha");
String res = Optional.ofNullable(m.get("b")).orElse("fallback");
System.out.println(res);
}
}
fallback
Пользовательские Map с поведением get по умолчанию (пример: возвращать калькулированное значение)
import java.util.*;
class DefaultMap extends HashMap{
private final V defaultValue;
DefaultMap(V def){this.defaultValue = def;}
@Override public V get(Object key){
return containsKey(key) ? super.get(key) : defaultValue;
}
public static void main(String[] args){
DefaultMap dm = new DefaultMap<>("d");
dm.put("a","alpha");
System.out.println(dm.get("a"));
System.out.println(dm.get("b"));
}
}
alpha d
Сценарии: использование computeIfAbsent для многопоточной ленивой инициализации, применение метода ссылки для компактности в потоках, использование Optional для обработки возможного отсутствия значения.