2016-02-06 2 views
0

Есть ли способ создать значение map lazy?ленивое копирование значения карты

Например

class MapTest { 
    @Lazy(soft = true) HashMap<String, List<String>> map 
} 

Doing как это я могу использовать этот вызов и получить null без ПОЛУЧАТЬ NullPointerException

new MapTest().map.key1 

Однако попытка вызвать

map.key1.remove(1) 

приведет к NullPointerException из-за value есть null. (было бы хорошо, если бы оно выбрало исключение IndexOutOfBounds)

Есть ли способ создать копию значения list?

+0

Что такое 'm' в вашем примере выше? –

+0

@tim_yates oh oh. Первоначально я создал экземпляр «MapTest» как «MapTest m = новый MapTest()». Затем я удалил его для примера, но «m» оставил – lapots

ответ

3

попробовать map.withDefault:

def map = [:].withDefault { [] } 
assert map.key1.isEmpty() 

Некоторые пояснения:

  • [:] является заводной способ создания экземпляра пустой хэш-карту
  • withDefault является заводной метод на карте которым взять закрытие. это закрытие является вызовом каждый раз, когда запрашивается ключ для инициализации значения, если оно не существует. это замыкание принимает один параметр (ключ) и должно значение
  • [] является заводным способом создать пустой список - {[]} является закрытие которым возвращает пустой список для каждого ключ

см другие примеры here

+0

Хм ... Но в этом случае мне нужно создать экземпляр 'map', верно? – lapots

+0

вы можете написать @Lazy def map = {[:]. WithDefault {[]}} –

+0

Но будет ли он инициализировать 'map' на месте или когда потребуется? Я имею в виду, не переопределит ли поведение по умолчанию «Lazy»? – lapots

Смежные вопросы