Как объединить два HashMap в Java
Источник: Asyncq В этом руководстве рассмотрены 4 различных варианта объединения HashMap в Java.
public static void main(String[] args) {
Map<String, String> default_config = default_config();
Map<String, String> dev_config = dev_config();
Map<String, String> prod_config = prod_config();
}
public static Map<String, String> default_config() {
Map<String, String> default_config = new HashMap<>();
default_config.put("prop_1", "val_1");
default_config.put("prop_2", "val_2");
default_config.put("prop_3", "val_3");
default_config.put("prop_4", "val_4");
default_config.put("prop_5", "val_5");
return default_config;
}
public static Map<String, String> dev_config(){
Map<String, String> dev_config = new HashMap<>();
dev_config.put("prop_1", "dev_val_1");
dev_config.put("prop_2", "dev_val_2");
dev_config.put("prop_3", "dev_val_3");
dev_config.put("prop_4", "dev_val_4");
return dev_config;
}
public static Map<String, String> prod_config(){
Map<String, String> prod_config = new HashMap<>();
prod_config.put("prop_1", "prod_val_1");
prod_config.put("prop_2", "prod_val_2");
prod_config.put("prop_3", "prod_val_3");
prod_config.put("prop_4", "prod_val_4");
return prod_config;
}
Вариант 1
В этом варианте мы перебираем каждую конфигурацию разработчика (dev config) и проверяем, существует ли ключ (key) в конфигурации default. Если да, то мы переопределяем его с помощью dev config и возвращаем обновленную конфигурацию default как dev_config.
public static void option_1(Map<String, String> default_config, final Map<String, String> dev_config, final Map<String, String> prod_config) {
default_config.forEach((k, v) -> {
if (dev_config.containsKey(k)) {
default_config.put(k, dev_config.get(k));
}
});
System.out.println(default_config);
}
Вариант 2
Мы можем использовать метод putAll в HashMap для объединения HashMap. Это самый удобный способ объединить хэш-карты.
public static void option2(Map<String, String> default_config, Map<String, String> dev_config, Map<String, String> prod_config) {
default_config.putAll(dev_config);
dev_config = default_config;
System.out.println(dev_config);
default_config.putAll(prod_config);
prod_config = default_config;
System.out.println(prod_config);
}
Вариант 3
Существует также еще один способ — слияние (merge), в котором мы можем перебрать default_config и объединить ее с dev_config. Если default config отсутствует, она будет вставлена в dev_config. В противном случае, если ключ присутствует, логика разрешения (resolution logic) будет принята как функция.
public static void option2(Map<String, String> default_config, Map<String, String> dev_config, Map<String, String> prod_config) {
// dev_config = common_props + diff_with_default
default_config.forEach((k, v) -> dev_config.merge(k, v, (v1, v2) -> v1));
System.out.println(dev_config);
// prod_config = common_props + diff_with_default
default_config.forEach((k, v) -> prod_config.merge(k, v, (v1, v2) -> v1));
System.out.println(prod_config);
}
Вариант 4
Набор Java-библиотек Google Guava также предоставляет несколько вспомогательных методов, которые позволяют нам присоединиться к HashMap.<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
</dependency>
Метод Maps.difference предоставит разницу между двумя хеш-картами. Мы можем определить разницу между dev_config и default_config, используя метод elementsOnlyOnRight. Как только мы получим разницу, мы можем использовать метод putAll для объединения разницы в dev_config.
public static void option3(Map<String, String> default_config, Map<String, String> dev_config, Map<String, String> prod_config){
MapDifference<String, String> difference = Maps.difference(dev_config, default_config);
dev_config.putAll(difference.entriesOnlyOnRight());
System.out.println(dev_config);
}
Заключение
В этой статье мы обсудили, как объединить две HashMap. Язык Java предоставляет нам для этого перебор конфигураций, метод putAll и слияние для простого объединения хэш-карт. Мы также можем использовать библиотеку Google Guava, которая имеет вспомогательные методы для объединения хэш-карт в Java.Как использовать Throw и Throws для обработки исключений в Java
Источник: Spring Java Благодаря этой публикации вы сможете на конкретных примерах научиться использовать ключевые слова throw и throws в Java. Обработка исключений в Java — наиболее эффективный способ устранения ошибок времени выполнения (runtime errors), возникающих в приложении. В случае ненормального потока выполнения обработка исключений, таких как ClassNotFoundException, IOException и некоторых других, помогает продолжить работу приложения в нормальном режиме. Для обработки исключений в Java используются ключевые слова throw и throws.Java throw
Throw — это ключевое слово, которое используется для явного создания исключений и настройки исключений в соответствии с потребностями Java.Синтаксис throw:
throw new exception_class(?message?);
Exception_class должен быть Throwable или дочерним классом Throwable.
Пример:
throw new ArithmeticException("/ by zero");
В следующем примере мы создадим собственное исключение в Java.
class MyException extends Exception {
public MyException(String s){
super(s);
}
}
public class Main {
public static void main(String args[]){
try {
//Здесь throw является объектом пользовательского исключения
throw new MyException("SpringJava");
}catch (MyException ex) {
System.out.println("Caught");
System.out.println(ex.getMessage());
}
}
}
Вывод:
Caught
SpringJava
Java throws
Throws — это ключевое слово, используемое для делегирования ответственности за обработку исключений вызывающему методу. В этом случае вызывающий метод отвечает за обработку возникшего исключения.Синтаксис throws:
type method_name(parameters) throws exception_list
Примеры Java throws при обработке исключений
Пример 1. В этом примере исключение не обрабатывается.
public class SpringJava{
public static void main(String[] args){
Thread.sleep(10000);
System.out.println("Hello SpringJava");
}
}
Вывод:
/SpringJava.java:3: error: unreported exception InterruptedException; must be caught or declared to be thrown
Thread.sleep(10000);
^
1 error
Пример 2.
В этом примере исключение обрабатывается с помощью throws.
public class SpringJava{
public static void main(String[] args)throws InterruptedException{
Thread.sleep(10000);
System.out.println("Hello SpringJava");
}
}
Вывод:
Hello SpringJava
Пример 3.
В этом примере исключение обрабатывается с использованием throw, throws и блока try-catch.
public class SpringJava{
static void demo() throws IllegalAccessException{
System.out.println("inside the demo() method");
throw new IllegalAccessException("Test");
}
public static void main(String args[]){
try {
demo();
}catch (IllegalAccessException e) {
System.out.println("caught in main.");
}
}
}
Вывод:
inside the demo() method
caught in the main
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ