Наконец попрощайтесь с нулем, я очень счастлив

Java

Привет, я Молчаливый Ван Эр, программист ростом с Хуан Цзяджу и красивым, как Энди Лау. С тех пор, как я начал писать первую строку кода Java 10 лет назад, я всегда чувствовал, что значение null — это нечто особенное в языке Java. является врагом, потому что он такой же, как знаменитый и раздражающийNullPointerException(NPE) идут рука об руку, и изобретатель NPE Тони Хоар однажды признался в 2009 году: «Нулевые ссылки — нелепый дизайн, как будто я проиграл пари на миллиард долларов».

Видите ли, нуль оказался другом и врагом.

Часто первое, что приходит нам в голову, чтобы указать, что элемент в списке не существует, — это вернуть null, что слишком разумно, чтобы возражать против него. Давайте смоделируем реальный сценарий приложения. Предположим, Сяо Эр теперь хочет получить список имен из базы данных, а затем вывести имена на консоль. Соответствующий код выглядит следующим образом.

public class NullDemo {
    public static void main(String[] args) {
        List<String> names = getNamesFromDB();
        if (names != null) {
            for (String name : names) {
                System.out.println(name);
            }
        }
    }

    public static List<String> getNamesFromDB() {
        // 模拟此时没有从数据库获取到对应的姓名。
        return null;
    }
}

потому чтоgetNamesFromDB()Метод возвращает null как признак того, что списка имен нет, а это означает, что при обходе списка список должен быть сначала оценен как пустой, иначе будет выдана ошибка NPE.if (names != null)Сними и попробуй, я сразу покажу тебе цвет.

Exception in thread "main" java.lang.NullPointerException
    at com.cmower.dzone.stopdoing3things.NullDemo.main(NullDemo.java:12)

Так что же делать Сяо Эру, если он не хочет быть пустым, а код выдает ошибку NPE при обходе? Закрой свои большие глаза и подумай об этом.

Что ж, отчет, я разобрался, предполагается, что Сяо Эр возвращает список длины 0, когда он получает имя из базы данных, чтобы указать, что данные не найдены. Пример кода показан ниже:

public class Null2Length0Demo {
    public static void main(String[] args) {
        List<String> names = getNamesFromDB();
        for (String name : names) {
            System.out.println(name);
        }
    }

    public static List<String> getNamesFromDB() {
        // 模拟此时没有从数据库获取到对应的姓名。
        return Collections.emptyList();
    }
}

Примечание:Collections.emptyList()Используется для возврата неизменного пустого списка, понимаете? Если вы этого не понимаете, я напишу еще один пример, который возвращает изменяемый пустой список, и вы сможете понять его, сравнив его.

public class Null2Length0MutableDemo {
    public static void main(String[] args) {
        List<String> names = getNamesFromDB();
        for (String name : names) {
            System.out.println(name);
        }
    }

    public static List<String> getNamesFromDB() {
        // 模拟此时没有从数据库获取到对应的姓名。
        return new ArrayList<>();
    }
}

new ArrayList<>()Возвращаемое значение является изменяемым, что означает, что вы также можете изменять элементы этого списка, например, добавление и удаление невозможно, потому что нет элементов для удаления.

Смотреть,Collections.emptyList()а такжеnew ArrayList<>()Оба могут заменить ноль, чтобы уменьшить количество ненужных нулей при печати списков, и этого надоедливого парня — NPE.

Можете ли вы придумать какие-либо другие решения, кроме моей идеи? Давай, снова закрой глаза, подумай об этом для Сяо Эр, может быть, ты придумаешь что-то новое — новый класс Optional в Java 8, класс-контейнер, который может хранить любой тип элемента, если значение существует, то
isPresent()метод возвращает true; класс Optional аккуратно устраняет NPE, предоставляя множество специализированных методов без явной проверки на null.

Давай, сначала прочитай пример, чтобы быть быстрым!

public class Null2OptionalDemo {
    public static void main(String[] args) {
        Optional<List<String>> list = getNamesFromDB();
        list.ifPresent(names -> {
            for (String name : names) {
                System.out.println(name);
            }
        });
    }

    public static Optional<List<String>> getNamesFromDB() {
        boolean hasName = true;
        if (hasName) {
            String [] names = {"沉默王二", "一枚有趣的程序员", "微信搜索关注我"};
            return Optional.of(Arrays.asList(names));
        }
        return Optional.empty();
    }
}

Не могу понять? Позвольте мне представиться ответственно, а вы пожмите друг другу руки.

Если имя существует в базе данных, используйтеOptional.of()Обертывает возвращаемое значение, чтобы вернуть объект типа Необязательный. Почему бы не использовать конструктор, потому что конструктор закрытый (исходный код показан ниже).

private Optional(T value) {
    this.value = value;
}

Тогда зачем использоватьOptional.of()Шерстяная ткань? Хм, хороший вопрос. Продолжить исходный код.

public static <T> Optional<T> of(T value) {
    return new Optional<>(Objects.requireNonNull(value));
}

1) Если значение равно нулю, тоObjects.requireNonNull(value)Он выкинет NPE (ну, мы должны встретиться в конце концов, но нам, программистам, не нужно проверять это).

2) Если значение не равно нулю, создайте обычный необязательный объект с помощью нового ключевого слова.

Что делать, если имя не существует в базе данных? использоватьOptional.empty()как возвращаемое значение. Давай, продолжай исходный код.

public static<T> Optional<T> empty() {
    @SuppressWarnings("unchecked")
    Optional<T> t = (Optional<T>) EMPTY;
    return t;
}

Хм, что такое ПУСТОЙ?

private static final Optional<?> EMPTY = new Optional<>(null);

Оказалось, что это приватная константа (статическая + финальная) класса Optional. Почему мне в этот момент вспоминается басня мистера Андерсена - гм, гм, плевать на императора, все равно "низ уродлив все-таки".

В этом случае вы можете использовать необязательный объектifPresent()метод, чтобы определить, существует ли значение.Если вам нужно иметь дело только с существованием значения, вы можете использовать лямбда-выражение для вывода имени напрямую.

list.ifPresent(names -> {
    for (String name : names) {
        System.out.println(name);
    }
});

Как-то грубо, да? Но несмотря ни на что, я наконец-то могу попрощаться с нулем и NPE во внешности и радоваться.

Что ж, мои дорогие читатели и друзья, вышеизложенное — это все содержание этой статьи, а лучших программистов можно увидеть здесь.Оригинальность не так проста, не просите пустой билет, пожалуйста, поставьте лайк этой статье, это будет сильнейшей мотивацией для меня писать больше качественных статей.

Если вы считаете, что статья немного полезна для вас, пожалуйста, выполните поиск по запросу "Тихий король 2"Прочтите это в первый раз, ответьте [666】【1024] Я также тщательно подготовил для вас обучающие видео высокой четкости 500G (которые разбиты на категории), а также копии интервью, организованных техническими экспертами большой фабрики.Исходный код этой статьи был включен вОблако кода,портал~