JavaRush /Java блог /Random /Кофе-брейк #261. Как объединить два HashMap в Java. Как и...

Кофе-брейк #261. Как объединить два HashMap в Java. Как использовать Throw и Throws для обработки исключений в Java

Статья из группы Random

Как объединить два HashMap в Java

Источник: Asyncq В этом руководстве рассмотрены 4 различных варианта объединения HashMap в Java. Кофе-брейк #261. Как объединить два HashMap в Java. Как использовать Throw и Throws для обработки исключений в Java - 1Объединение двух или более Map — очень распространенная операция в Java-разработке. Ниже представлен конкретный пример, который поможет лучше понять, как это можно сделать различными способами. Допустим, у нас в Map есть конфигурация сервера по умолчанию (default). Каждая среда будет иметь свои собственные конфигурации. Мы можем объединить конфигурацию dev и prod с конфигурацией default. Далее вы можете увидеть код, который настраивает default_config, dev_config и prod_config.

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

Часто задаваемые вопросы

Вопрос 1: Что делают throw и throws в Java?

Ответ. Ключевое слово throw используется для явного создания исключения. Это ключевое слово может генерировать только одно исключение за раз. Ключевое слово throws можно использовать для объявления нескольких исключений, разделенных запятой (,).

Вопрос 2: Можем ли мы использовать throw без try?

Ответ. Нет, но мы можем использовать ключевое слово throws для обработки исключений без использования блока try-catch.

Вопрос 3: Почему мы используем throws вместо try catch?

Ответ. Мы можем использовать ключевое слово throws, чтобы объявить исключение с помощью объявления метода. Он используется для принудительной генерации исключения, в то время как блок try-catch обрабатывает исключения, создаваемые кодом Java.

Заключение

В этой теме мы на примерах узнали, как использовать ключевые слова throw и throws для обработки исключений в Java.
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ