1. Общ преглед
В този урок ще разгледаме накратко новия метод по подразбиране computeIfAbsent на интерфейса Map, въведен в Java 8.
По-конкретно, ще разгледаме неговия подпис, използването и как се справя с различни случаи.
2. Метод Map.computeIfAbsent
Нека започнем, като разгледаме подписа на computeIfAbsent :
default V computeIfAbsent(K key, Function mappingFunction)
Методът computeIfAbsent взема два параметъра. Първият параметър е ключът, а вторият параметър е mappingFunction. Важно е да знаете, че функцията за картографиране се извиква само ако картографирането не е налице.
2.1. Ключ, свързан с ненулева стойност
Първо, той проверява дали ключът присъства в картата. Ако ключът присъства и ненулевата стойност е свързана с ключа, той връща тази стойност:
Map stringLength = new HashMap(); stringLength.put("John", 5); assertEquals((long)stringLength.computeIfAbsent("John", s -> s.length()), 5);
Както виждаме, ключът „John“ има ненулево картографиране, той връща стойността 5. Ако се използва нашата функция за картографиране, бихме очаквали функцията да върне дължината на 4.
2.2. Използване на функцията за картографиране за изчисляване на стойността
Освен това, ако ключът не присъства в картата или нулевата стойност е свързана с ключа, тогава той се опитва да изчисли стойността, използвайки дадената mappingFunction . Освен това той въвежда изчислената стойност в картата, освен ако изчислената стойност е нула.
Нека да разгледаме използването на mappingFunction в метода computeIfAbsent :
Map stringLength = new HashMap(); assertEquals((long)stringLength.computeIfAbsent("John", s -> s.length()), 4); assertEquals((long)stringLength.get("John"), 4);
Тъй като ключът „John“ не присъства, той изчислява стойността чрез предаване на ключа като параметър на mappingFunction .
2.3. Функцията за картографиране връща нула
Също така, ако mappingFunction връща null , картата не записва картографиране:
Map stringLength = new HashMap(); assertEquals(stringLength.computeIfAbsent("John", s -> null), null); assertNull(stringLength.get("John"));
2.4. Функцията за картографиране хвърля изключение
И накрая, ако mappingFunction изхвърли непроверено изключение, изключението се изхвърля отново и картата не записва картографиране:
@Test(expected = RuntimeException.class) public void whenMappingFunctionThrowsException_thenExceptionIsRethrown() { Map stringLength = new HashMap(); stringLength.computeIfAbsent("John", s -> { throw new RuntimeException(); }); }
Виждаме, че mappingFunction изхвърля RuntimeException , който се разпространява обратно към метода computeIfAbsent .
3. Заключение
В тази бърза статия разгледахме метода computeIfAbsent , неговия подпис и използването му. Накрая видяхме как се справя с различни случаи.
Както винаги, всички тези примерни кодове са достъпни в GitHub.