betacode

Руководство Java Map

  1. Map
  2. Examples
  3. Null Key/Value
  4. Map Methods
  5. of(..), ofEntries​(..), copyOf​(..)
  6. put​(K key, V value)
  7. putIfAbsent​(K key, V value)
  8. putAll​(Map)
  9. get​(Object key)
  10. getOrDefault​(Object key, V defaultValue)
  11. containsKey​(Object key)
  12. containsValue​(Object value)
  13. remove​(Object key)
  14. remove​(Object key, Object value)
  15. clear()
  16. forEach​(BiConsumer)
  17. keySet()
  18. entrySet()
  19. values()
  20. size()
  21. replace​(K key, V value)
  22. replace​(K key, V oldValue, V newValue)
  23. replaceAll​(BiFunction)
  24. merge​(K key, V value, BiFunction)
  25. compute​(K key, BiFunction)
  26. computeIfAbsent​(K key, Function)
  27. computeIfPresent​(K key, BiFunction)

1. Map

В Java, Map является интерфейсом, представляющим объект, который содержит сопоставления между ключами (key) и значениями (value). Каждый ключ соответствует значению. Одним из типичных примеров здесь можно назвать телефонную книгу, номер телефона - это ключ, а имя человека - это значение. Каждый ключ будет соответствовать только одному значению.
Иерархия интерфейсов группы Map:
Иерархия классов в группе Map:
Связь между интерфейсами и классами в группе Map:

2. Examples

Поскольку Map является интерфейсом, вы можете создать ее только из одного из подклассов. В этом примере мы создадим объект Map, имитирующий телефонную книгу.
MapEx1.java
package org.o7planning.map.ex;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
 
public class MapEx1 {
 
    public static void main(String[] args) {
        Map<String, String> phonebook = new HashMap<String, String>();
 
        phonebook.put("01000005", "Tom");
        phonebook.put("01000002", "Jerry");
        phonebook.put("01000003", "Tom");
        phonebook.put("01000004", "Donald");
        
        Set<String> phoneNumbers = phonebook.keySet();
 
        for (String phoneNumber : phoneNumbers) {
            String name = phonebook.get(phoneNumber);
            
            System.out.println("Phone Number: " + phoneNumber + " ==> Name: " + name);
        }
    }
}
Output:
Phone Number: 01000004 ==> Name: Donald
Phone Number: 01000003 ==> Name: Tom
Phone Number: 01000005 ==> Name: Tom
Phone Number: 01000002 ==> Name: Jerry
Продолжая приведенный выше пример, вы можете получить доступ к данным Map через коллекцию Map.Entry:
MapEx2.java
package org.o7planning.map.ex;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
 
public class MapEx2 {
 
    public static void main(String[] args) {
        Map<String, String> phonebook = new HashMap<String, String>();
 
        phonebook.put("01000005", "Tom");
        phonebook.put("01000002", "Jerry");
        phonebook.put("01000003", "Tom");
        phonebook.put("01000004", "Donald");
        
        Set<Map.Entry<String,String>> contacts = phonebook.entrySet();
 
        for (Map.Entry<String,String> contact: contacts) {
            String phoneNumber = contact.getKey();
            String name = contact.getValue();
            
            System.out.println("Phone Number: " + phoneNumber + " ==> Name: " + name);
        }
    }
}
Output:
Phone Number: 01000004 ==> Name: Donald
Phone Number: 01000003 ==> Name: Tom
Phone Number: 01000005 ==> Name: Tom
Phone Number: 01000002 ==> Name: Jerry

3. Null Key/Value

Map может разрешить ключ null, это зависит от класса, который его реализует, например от класса HashMap:
MapEx3.java
package org.o7planning.map.ex;

import java.util.HashMap;
import java.util.Map;
 
public class MapEx3 {
 
    public static void main(String[] args) {
        // String employeeNumber, int salary
        Map<String, Integer> mapSalary = new HashMap<String, Integer>();
 
        mapSalary.put("E001", 1200);
        mapSalary.put("E002", 2000);
        
        mapSalary.put(null, 1000); // Base salary
        
        int value = mapSalary.get(null);
        System.out.println(value); // 1000
    }
}
Output:
1000
Map может разрешить отображение с значением null. Это зависит от класса, реализующего интерфейс Map.
MapEx3.java
package org.o7planning.map.ex;

import java.util.HashMap;
import java.util.Map;

public class MapEx3 {

    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<String, Integer>();

        map.put("AA", null);
        
        Integer value = map.get("AA");
        System.out.println("AA ==> " + value);
        
        boolean test = map.containsKey("AA");
        System.out.println("Contains AA? " + test); // true
        
        test = map.containsKey("BB");
        System.out.println("Contains BB? " + test); // false
    }
}
Output:
AA ==> null
Contains AA? true
Contains BB? false

4. Map Methods

Методы интерфейса Map:
void clear()
boolean containsKey​(Object key)
boolean containsValue​(Object value)
boolean isEmpty()

Set<Map.Entry<K,​V>> entrySet()
boolean equals​(Object o)
V get​(Object key)

Set<K> keySet()

Collection<V> values()
V remove​(Object key)
V put​(K key, V value)
void putAll​(Map<? extends K,​? extends V> m)

int size()
int hashCode()

static <K,​V> Map<K,​V> of()
static <K,​V> Map<K,​V> of​(K k1, V v1)
static <K,​V> Map<K,​V> of​(K k1, V v1, K k2, V v2)
static <K,​V> Map<K,​V> of​(K k1, V v1, K k2, V v2, K k3, V v3)
static <K,​V> Map<K,​V> of​(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4)
static <K,​V> Map<K,​V> of​(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5)
static <K,​V> Map<K,​V> of​(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6)
static <K,​V> Map<K,​V> of​(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7)
static <K,​V> Map<K,​V> of​(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8)
static <K,​V> Map<K,​V> of​(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9)
static <K,​V> Map<K,​V> of​(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10)
static <K,​V> Map<K,​V> ofEntries​(Map.Entry<? extends K,​? extends V>... entries)
static <K,​V> Map<K,​V> copyOf​(Map<? extends K,​? extends V> map)
static <K,​V> Map.Entry<K,​V> entry​(K k, V v)

default V putIfAbsent​(K key, V value)
default boolean remove​(Object key, Object value)
default V replace​(K key, V value)
default boolean replace​(K key, V oldValue, V newValue)
default void replaceAll​(BiFunction<? super K,​? super V,​? extends V> function)
default V merge​(K key, V value, BiFunction<? super V,​? super V,​? extends V> remappingFunction)
default V compute​(K key, BiFunction<? super K,​? super V,​? extends V> remappingFunction)
default V computeIfAbsent​(K key, Function<? super K,​? extends V> mappingFunction)
default V computeIfPresent​(K key, BiFunction<? super K,​? super V,​? extends V> remappingFunction)
default void forEach​(BiConsumer<? super K,​? super V> action)
default V getOrDefault​(Object key, V defaultValue)
Интерфейс Map имеет несколько дополнительных методов, которые могут не поддерживаться в классе, реализующем этот интерфейс. Если вы используете их, вы получите исключение UnsupportedOperationException.
void clear()
V put​(K key, V value)  
void putAll​(Map<? extends K,​? extends V> m)
V remove​(Object key)

5. of(..), ofEntries​(..), copyOf​(..)

Статический метод Map.of(..) создает неизменяемый (unmodifiable) объект Map из пар ключей и значений.
static <K,​V> Map<K,​V> of()
static <K,​V> Map<K,​V> of​(K k1, V v1)
static <K,​V> Map<K,​V> of​(K k1, V v1, K k2, V v2)
static <K,​V> Map<K,​V> of​(K k1, V v1, K k2, V v2, K k3, V v3)
static <K,​V> Map<K,​V> of​(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4)
static <K,​V> Map<K,​V> of​(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5)
static <K,​V> Map<K,​V> of​(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6)
static <K,​V> Map<K,​V> of​(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7)
static <K,​V> Map<K,​V> of​(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8)
static <K,​V> Map<K,​V> of​(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9)
static <K,​V> Map<K,​V> of​(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10)
Статический метод Map.ofEntry(..) создает неизменяемый (unmodifiable) объект Map из заданных объектов Map.Entry.
static <K,​V> Map<K,​V> ofEntries​(Map.Entry<? extends K,​? extends V>... entries)
Статический метод Map.copyOf(..) создает неизменяемый (unmodifiable) объект Map из данного объекта Map.
static <K,​V> Map<K,​V> copyOf​(Map<? extends K,​? extends V> map)
Статические методы Map.of, Map.ofEntries и Map.copyOf обеспечивают удобный способ создания неизменяемых Map. Объекты Map, созданные этими методами, имеют следующие характеристики:
  • Они не поддаются изменению. Ключи и значения не могут быть добавлены, удалены или обновлены. Вызов любого метода мутатора на Map всегда вызовет исключение UnsupportedOperationException. Однако, если содержащиеся ключи или значения сами по себе изменчивы, это может привести к несогласованному поведению Map или изменению ее содержимого.
  • Они запрещают нулевые ключи и значения null. Попытки создать их с нулевыми ключами или значениями null приводят к исключению NullPointerException.
  • Они сериализуемы (serializable), если все ключи и значения сериализуемы.
  • Не допускает дублирования ключей во входных параметрах. В противном случае будет выдано исключение IllegalArgumentException.
  • Порядок итераций отображений не определен и может быть изменен.
Map.of Example:
Map_of_ex1.java
package org.o7planning.map.ex;

import java.util.Map;

public class Map_of_ex1 {

    public static void main(String[] args) {

        // Create an unmodifiable Map:
        Map<String, Integer> empMap = Map.of("E01", 1000, "E02", 2000, "E03", 1200);

        empMap.forEach((empNumber, salary) -> {
            System.out.println("Emp Number: " + empNumber + ", Salary: " + salary);
        });
    }
}
Output:
Emp Number: E03, Salary: 1200
Emp Number: E02, Salary: 2000
Emp Number: E01, Salary: 1000
Map.ofEntries Example:
Map_ofEntry_ex1.java
package org.o7planning.map.ex;

import java.util.Map;

public class Map_ofEntry_ex1 {

    public static void main(String[] args) {

        Map.Entry<String, Integer> entry1 = Map.entry("E01", 1000);
        Map.Entry<String, Integer> entry2 = Map.entry("E02", 2000);
        Map.Entry<String, Integer> entry3 = Map.entry("E03", 1200);

        Map<String, Integer> unmodifiableMap = Map.ofEntries(entry1, entry2, entry3);
        
        unmodifiableMap.forEach((empNumber, salary) -> {
            System.out.println("Emp Number: " + empNumber + ", Salary: " + salary);
        });
    }
}
Output:
Emp Number: E02, Salary: 2000
Emp Number: E03, Salary: 1200
Emp Number: E01, Salary: 1000
Map.copyOf Example:
Map_copyOf_ex1.java
package org.o7planning.map.ex;

import java.util.HashMap;
import java.util.Map;

public class Map_copyOf_ex1 {

    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        
        map.put("E01", 1000);
        map.put("E02", 2000);
        map.put("E03", 1200);

        // Unmodifiable Map
        Map<String, Integer> unmodifiableMap = Map.copyOf(map);
        
        unmodifiableMap.forEach((empNumber, salary) -> {
            System.out.println("Emp Number: " + empNumber + ", Salary: " + salary);
        });
    }
}
Например: Объект Map, созданный статическими методами Map.of, Map.ofEntries и Map.copyOf , не поддается изменению (unmodifiable). Он не поддерживает никаких операций по изменению своих данных. Например, put, clear,..
Map_of_ex2.java
package org.o7planning.map.ex;

import java.util.Map;

public class Map_of_ex2 {

    public static void main(String[] args) {

        // Create an unmodifiable Map:
        Map<String, Integer> empMap = Map.of("E01", 1000, "E02", 2000, "E03", 1200);

        // Update new value.
        empMap.put("E02", 5000); // ==> throw UnsupportedOperationException
        
        empMap.put("E05", 3000); // ==> throw UnsupportedOperationException
        
        empMap.remove("E01");  // ==> throw UnsupportedOperationException
        
        empMap.clear();   // ==> throw UnsupportedOperationException
    }
}

6. put​(K key, V value)

public V put​(K key, V value)  // Optional Operation
Добавим сопоставление (key, value) в Map, если key не существует, и вернет значение null. В противном случае новое значение будет заменено на старое значение, соответствующее key, и вернет старое значение.

7. putIfAbsent​(K key, V value)

default V putIfAbsent(K key, V value) {
    V v = get(key);
    if (v == null) {
        v = put(key, value);
    }
    return v;
}
Этот метод аналогичен методу put(key,value), но он работает только в том случае, если key не существует на Map или он сопоставляется с нулевым значением null. Метод возвращает null или старое значение.

8. putAll​(Map)

public void putAll​(Map<? extends K,​? extends V> m)
Скопируем все сопоставления (mapping) из указанного объекта Map в текущий объект Map.

9. get​(Object key)

public V get​(Object key)
Возвращает значение сопоставления, соответствующее key, или null, если такого сопоставления не существует.

10. getOrDefault​(Object key, V defaultValue)

public default V getOrDefault(Object key, V defaultValue) // Java 8
Возвращает значение сопоставления, соответствующее key, или defaultValue , если такого сопоставления не существует.
Например:
Map_getOrDefault​_ex1.java
package org.o7planning.map.ex;

import java.util.HashMap;
import java.util.Map;

public class Map_getOrDefault​_ex1 {

    public static void main(String[] args) {
         Map<String, String> appConfigs = new HashMap<String, String>();
        
         appConfigs.put("INPUT_DIRECTORY", "C:/App/input");
         appConfigs.put("IMAGE_DIRECTORY", "C:/App/image");
        
        
         String outputDir = appConfigs.getOrDefault("OUTPUT_DIRECTORY", "C:/App/output");
        
         System.out.println("App Output Directory: " + outputDir);
    }
}
Output:
App Output Directory: C:/App/output

11. containsKey​(Object key)

public boolean containsKey​(Object key)
Возвращает true, если эта Map содержит сопоставление для указанного ключа.

12. containsValue​(Object value)

public boolean containsValue​(Object value)
Возвращает true, если эта Map имеет хотя бы одно сопоставление с указанным значением.
Например: Map содержит сопоставления между названием бренда и страной, проверьте, является ли бренд из определенной страны.
Map_containsValue​_ex1.java
package org.o7planning.map.ex;

import java.util.HashMap;
import java.util.Map;

public class Map_containsValue​_ex1 {
    
    public static void main(String[] args)  {
        // String brand ==> String country
        Map<String, String> brandMap  = new HashMap<String, String>();
        
        brandMap.put("SamSung", "Korea");
        brandMap.put("LG", "Korea");
        brandMap.put("Alibaba", "China");
        brandMap.put("Toyota", "Japan");
        brandMap.put("Hyundai", "Korea");
        brandMap.put("Vinfast", "Vietnam"); // value = "Vietnam"!
        brandMap.put("Honda", "Japan");
        brandMap.put("Huwei", "China");
        
        boolean contain = brandMap.containsValue("Vietnam");
        System.out.println("Does the Map contain 'Vietnam' value? " + contain);
      
        contain = brandMap.containsValue("Thailand");
        System.out.println("Does the Map contain 'Thailand' value? " + contain);
    }  
}
Output:
Does the Map contain 'Vietnam' value? true
Does the Map contain 'Thailand' value? false

13. remove​(Object key)

public V remove​(Object key) // Optional Operation
Удалим с Map сопоставление, соответствующее key. Возвращает значение сопоставления или null, если сопоставление не существует.

14. remove​(Object key, Object value)

public default boolean remove(Object key, Object value)  {
    if (this.containsKey(key) && Objects.equals(this.get(key), value)) {
        this.remove(key);
         return true;
     } else {
         return false;
     }
}
Удаляет сопоставление (key,value) с Map и возвращает true, если оно действительно существует, в противном случае возвращает false.

15. clear()

public void clear()  // Optional operation.
Удаляет все сопоставления с этой Map. Map будет пуста после вызова метода.

16. forEach​(BiConsumer)

public default void forEach​(BiConsumer<? super K,​? super V> action)
Выполняет указанное действие с каждой парой (key,value) of Map до тех пор, пока не будут обработаны все пары или не возникнет исключение.
Например: Объект Map содержит сопоставления между названием страны и населением.
Map_forEach_ex1.java
package org.o7planning.map.ex;

import java.util.HashMap;
import java.util.Map;

public class Map_forEach_ex1 {
    
    public static void main(String[] args)  {
        // Data in 2021.
        // String  country ==> Integer population (Million)
        Map<String, Integer> populationMap  = new HashMap<String, Integer>();
        
        populationMap.put("Vietnam", 98);  
        populationMap.put("Phillipine", 109);
        populationMap.put("United States", 330);
        populationMap.put("Indonesia", 273);
        populationMap.put("Russia", 145);
        
        // forEach(BiConsumer):
        populationMap.forEach((country, population) -> System.out.println(country + " --> " + population));
    }  
}
Output:
Vietnam --> 98
United States --> 330
Phillipine --> 109
Indonesia --> 273
Russia --> 145

17. keySet()

public Set<K> keySet()
Возвращает представление в виде Set , содержащего все ключи of Map. Объект Set и текущий объект Map связаны между собой. Изменения на Map повлияют на Set и наоборот.
  • Добавление или удаление сопоставления с Map приведет к добавлению или удалению элемента из Set.
  • Методы, удаляющие элементы из Set, такие как Set.iterator().remove, Set.remove, Set.removeAll, Set.retainAll, Set.clear.. будут удалять соответствующие сопоставления с Map.
  • Этот объект Set не поддерживает операции Set.add, Set.addAll.
Например: Объект Map содержит сопоставления между названием страны и населением.
Map_keySet_ex1.java
package org.o7planning.map.ex;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Map_keySet_ex1 {
    
    public static void main(String[] args)  {
        // Data in 2021.
        // String  country ==> Integer population (Million)
        Map<String, Integer> populationMap  = new HashMap<String, Integer>();
        
        populationMap.put("Vietnam", 98);  
        populationMap.put("Phillipine", 109);
        populationMap.put("United States", 330);
        populationMap.put("Indonesia", 273);
        populationMap.put("Russia", 145);
        
        Set<String> countrySet  = populationMap.keySet();
        
        for(String country: countrySet)  {
            System.out.println(country);
        }
    }  
}
Output:
Vietnam
United States
Phillipine
Indonesia
Russia
Map_keySet_ex2.java
package org.o7planning.map.ex;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Map_keySet_ex2 {
    
    public static void main(String[] args)  {
        // Data in 2021.
        // String  country ==> Integer population (Million)
        Map<String, Integer> populationMap  = new HashMap<String, Integer>();
        
        populationMap.put("Vietnam", 98);  
        populationMap.put("Phillipine", 109);
        populationMap.put("United States", 330);
        populationMap.put("Indonesia", 273);
        populationMap.put("Russia", 145);
        
        Set<String> countrySet  = populationMap.keySet();
        
        System.out.println("--- Countries: ---");
        for(String country: countrySet)  {
            System.out.println(country);
        }
        //
        countrySet.remove("Phillipine");
        countrySet.remove("Indonesia");
        
        System.out.println();
        System.out.println("--- Map (After removal): ---");
        
        populationMap.forEach((country, population) -> {
            System.out.println(country +" --> " + population);
        });
    }  
}
Output:
--- Countries: ---
Vietnam
United States
Phillipine
Indonesia
Russia

--- Map (After removal): ---
Vietnam --> 98
United States --> 330
Russia --> 145

18. entrySet()

No ADS
public Set<Map.Entry<K,​V>> entrySet()
Возвращает представление в виде Set , содержащего все элементы Map.Entry of the Map. Объект Set и текущий объект Map связаны между собой. Изменения на Map повлияют на Set и наоборот.
  • Добавление или удаление сопоставления с Map приведет к добавлению или удалению элемента из Set.
  • Методы, удаляющие элементы из Set, такие как Set.iterator().remove, Set.remove, Set.removeAll, Set.retainAll, Set.clear.. будут удалять соответствующие сопоставления с Map.
  • Этот объект Set не поддерживает операции Set.add, Set.addAll.
Например: Объект Map содержит сопоставления между названием страны и населением.
Map_entrySet_ex1.java
package org.o7planning.map.ex;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Map_entrySet_ex1 {
    
    public static void main(String[] args)  {
        // Data in 2021.
        // String  country ==> Integer population (Million)
        Map<String, Integer> populationMap  = new HashMap<String, Integer>();
        
        populationMap.put("Vietnam", 98);  
        populationMap.put("Phillipine", 109);
        populationMap.put("United States", 330);
        populationMap.put("Indonesia", 273);
        populationMap.put("Russia", 145);
        
        Set<Map.Entry<String,Integer>> set = populationMap.entrySet();
        
        for(Map.Entry<String,Integer> entry: set) {
            System.out.println(entry.getKey() +" --> " + entry.getValue());
        }
    }  
}
Output:
Vietnam --> 98
United States --> 330
Phillipine --> 109
Indonesia --> 273
Russia --> 145
Продолжая приведенный выше пример, мы удаляем страны с населением более 200 (миллионов) из объекта Map.
Map_entrySet_ex2.java
package org.o7planning.map.ex;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class Map_entrySet_ex2 {
    
    public static void main(String[] args)  {
        // Data in 2021.
        // String  country ==> Integer population (Million)
        Map<String, Integer> populationMap  = new HashMap<String, Integer>();
        
        populationMap.put("Vietnam", 98);  
        populationMap.put("Phillipine", 109);
        populationMap.put("United States", 330);
        populationMap.put("Indonesia", 273);
        populationMap.put("Russia", 145);
        
        Set<Map.Entry<String,Integer>> set = populationMap.entrySet();
        
        Iterator<Map.Entry<String,Integer>> iterator = set.iterator();
        
        // Remove the Countries with population greater than 200 Million.
        while(iterator.hasNext()) {
            Map.Entry<String,Integer> entry = iterator.next();
            
            if(entry.getValue() > 200)  {
                iterator.remove();
            }
        }
        // After removal.
        // forEach(Consumer)
        set.forEach(entry -> {
            System.out.println(entry.getKey() +" --> " + entry.getValue());
        });
    }  
}
Output:
Vietnam --> 98
Phillipine --> 109
Russia --> 145

19. values()

No ADS
public Collection<V> values()
Возвращает представление в виде Collection, содержащей все значения Map. Объект Collection и текущий объект Map связаны друг с другом. Изменения на Map повлияют на Collection и наоборот.
  • Добавление или удаление сопоставления из Map приведет к добавлению или удалению элемента из Collection.
  • Изменение значения сопоставления повлияет на Collection.
  • Методы, удаляющие элементы из Collection, такие как Collection.iterator().remove, Collection.remove, Collection.removeAll, Collection.retainAll, Collection.clear.. будут удалять соответствующие сопоставления с Map.
  • Этот объект Collection не поддерживает операции Collection.add, Collection.addAll.
Например: Объект Map содержит сопоставления между названием бренда (brand) и страной. Распечатайте значения объекта Map.
Map_values_ex1.java
package org.o7planning.map.ex;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

public class Map_values_ex1 {
    
    public static void main(String[] args)  {
        // String brand ==> String country
        Map<String, String> brandMap  = new HashMap<String, String>();
        
        brandMap.put("SamSung", "Korea");
        brandMap.put("LG", "Korea");
        brandMap.put("Alibaba", "China");
        brandMap.put("Toyota", "Japan");
        brandMap.put("Hyundai", "Korea");
        brandMap.put("Vinfast", "Vietnam");
        brandMap.put("Honda", "Japan");
        brandMap.put("Huwei", "China");
        
        Collection<String> countries = brandMap.values();
        
        for(String country: countries)  {
            System.out.println(country);
        }
    }  
}
Output:
China
Japan
Vietnam
Korea
China
Korea
Korea
Japan
Продолжая приведенный выше пример, удалите бренд из Китая из объекта Map::
Map_values_ex2.java
package org.o7planning.map.ex;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class Map_values_ex2 {
    
    public static void main(String[] args)  {
        // String brand ==> String country
        Map<String, String> brandMap  = new HashMap<String, String>();
        
        brandMap.put("SamSung", "Korea");
        brandMap.put("LG", "Korea");
        brandMap.put("Alibaba", "China");
        brandMap.put("Toyota", "Japan");
        brandMap.put("Hyundai", "Korea");
        brandMap.put("Vinfast", "Vietnam");
        brandMap.put("Honda", "Japan");
        brandMap.put("Huwei", "China");
        
        Collection<String> countries = brandMap.values();
        
        Iterator<String> countryIte = countries.iterator();
        
        String country;
        while(countryIte.hasNext()) {
            country = countryIte.next();
            if("China".equals(country)) {
                countryIte.remove();
            }
        }
        // After remove
        for(String brand: brandMap.keySet()) {
            System.out.println(brand +" : " + brandMap.get(brand));
        }
    }  
}
Output:
Toyota : Japan
Vinfast : Vietnam
SamSung : Korea
LG : Korea
Hyundai : Korea
Honda : Japan

20. size()

public int size()
Возвращает количество отображений на этой Map . Если Map содержит больше Integer.MAX_VALUE элементов, возвращает Integer.MAX_VALUE.

21. replace​(K key, V value)

public default V replace​(K key, V value)
Если в Map существует сопоставление с ключом key, оно будет заменено сопоставлением (key,value) и вернет старое значение, в противном случае, никаких действий не будет сделано и вернет null.
Например:
Map_replace_ex1.java
package org.o7planning.map.ex;

import java.util.HashMap;
import java.util.Map;

public class Map_replace_ex1 {

    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<String, Integer>();

        map.put("A", 1200);
        map.put("B", null);
        map.put("C", 1500);

        // key does not exists, no replace, return null
        Integer oldValue1 = map.replace("A1", 3000);

        // key exists!, replace!, return null (old value).
        Integer oldValue2 = map.replace("B", 5000);

        // key exists!, replace!, return 1500 (old value).
        Integer oldValue3 = map.replace("C", 2000);

        System.out.println("oldValue1: " + oldValue1); // null
        System.out.println("oldValue2: " + oldValue2); // null (old value).
        System.out.println("oldValue3: " + oldValue3); // 1500 (old value).
        System.out.println();

        for (String key : map.keySet()) {
            System.out.println(key + " ==> " + map.get(key));
        }
    }
}
Output:
oldValue1: null
oldValue2: null
oldValue3: 1500

A ==> 1200
B ==> 5000
C ==> 2000

22. replace​(K key, V oldValue, V newValue)

public default boolean replace​(K key, V oldValue, V newValue)
Если сопоставление (key,oldValue) действительно существует на Map, оно будет заменено сопоставлением (key,newValue) и вернет true, в противном случае, никаких действий не будет сделано и вернет false.

23. replaceAll​(BiFunction)

No ADS
public default void replaceAll​(BiFunction<? super K,​? super V,​? extends V> function)
Используйте function, заданную аргументом, чтобы заменить значение для всех отображений на Map. Вызов приведенного выше метода будет эквивалентен выполнению следующего кода:
for (Map.Entry<K, V> entry : map.entrySet()) {
    entry.setValue(function.apply(entry.getKey(), entry.getValue()));
}
Например: объект Map содержит сопоставление между кодовым номером сотрудников (Employee Number) и зарплатой. Используйте метод replaceAll для увеличения заработной платы на 50% для каждого сотрудника
Map_replaceAll_ex1.java
package org.o7planning.map.ex;

import java.util.HashMap;
import java.util.Map;

public class Map_replaceAll_ex1 {

    public static void main(String[] args) {

        // Create Map (Employee Number --> Salary)
        Map<String, Float> empMap = new HashMap<>();
        empMap.put("E01", 1000f);
        empMap.put("E02", 2000f);
        empMap.put("E03", 1200f);
        
        // Salary update for all employees, 50% increase.
        empMap.replaceAll((empNumber, salary) -> {
            return salary + salary * 0.5f;
        });
        // Print out:
        empMap.forEach((empNumber, salary) -> {
            System.out.println(empNumber + " --> " + salary);
        });
    }
}
Output:
E02 --> 3000.0
E01 --> 1500.0
E03 --> 1800.0

24. merge​(K key, V value, BiFunction)

default V merge(K key, V value,
        BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
    Objects.requireNonNull(remappingFunction);
    Objects.requireNonNull(value);
    V oldValue = get(key);
    V newValue = (oldValue == null) ? value :
               remappingFunction.apply(oldValue, value);
    if (newValue == null) {
        remove(key);
    } else {
        put(key, newValue);
    }
    return newValue;
}

25. compute​(K key, BiFunction)

default V compute(K key,
        BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
    Objects.requireNonNull(remappingFunction);
    V oldValue = get(key);

    V newValue = remappingFunction.apply(key, oldValue);
    if (newValue == null) {
        // delete mapping
        if (oldValue != null || containsKey(key)) {
            // something to remove
            remove(key);
            return null;
        } else {
            // nothing to do. Leave things as they were.
            return null;
        }
    } else {
        // add or replace old mapping
        put(key, newValue);
        return newValue;
    }
}

26. computeIfAbsent​(K key, Function)

default V computeIfAbsent(K key,
        Function<? super K, ? extends V> mappingFunction) {
    Objects.requireNonNull(mappingFunction);
    V v;
    if ((v = get(key)) == null) {
        V newValue;
        if ((newValue = mappingFunction.apply(key)) != null) {
            put(key, newValue);
            return newValue;
        }
    }
    return v;
}

27. computeIfPresent​(K key, BiFunction)

default V computeIfPresent(K key,
        BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
    Objects.requireNonNull(remappingFunction);
    V oldValue;
    if ((oldValue = get(key)) != null) {
        V newValue = remappingFunction.apply(key, oldValue);
        if (newValue != null) {
            put(key, newValue);
            return newValue;
        } else {
            remove(key);
            return null;
        }
    } else {
        return null;
    }
}
No ADS