Не пишите такой код, этими методами не пахнет?

Java
Не пишите такой код, этими методами не пахнет?

JDK8 должна быть самой сильной версией Java, в этой версии добавлено множество функций, что делает ее намного более удобной для нас в разработке.

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

С точки зрения правильности кода, конечно, нет проблем со старым способом написания, но единственный недостаток в том, что количество строк кода относительно велико и он более громоздкий.

Для того же требования, используя новый метод JDK8, фактически можно сделать несколько строк кода, поэтому код станет очень кратким.

Сегодня я возьму в качестве примеров еще три распространенных сценария, чтобы научить вас нескольким приемам использования JDK8.MapДобавленные методы упрощают разработку кода.

Взгляните на будущее использованиеMapНесколько новых методов:

Добро пожаловать, чтобы обратить внимание на мой официальный аккаунт: Xiaohei в 11:30, чтобы получить ежедневный толчок галантерейных товаров. Если вас интересует мой рекомендуемый контент, вы также можете подписаться на мой блог:studyidea.cn

Предотвращение проблем с нулевым указателем

В ежедневной разработке мы обычно начинаем сMapПолучите элементы, а затем выполните соответствующую бизнес-обработку. Пример кода выглядит следующим образом:

Map<String, String> map = new HashMap();
map.put("公号", "小黑十一点半");
map.put("主理人", "楼下小黑哥");
// 可能存在 NPE 问题
System.out.println(map.get("支付").toUpperCase());

Если пример кода как прямой процесс, один разMapЕсли соответствующий элемент не существует, то мы столкнемся с проблемой нулевого указателя.

Чтобы решить эту проблему, обычно мы можем сначала определить, является ли элементnull, если бы неnull, а затем выполните соответствующую бизнес-обработку.

// 第一种 if 判空
String value = map.get("支付");
if (!Objects.isNull(value)) {
    System.out.println(value.toUpperCase());
}

Единственным недостатком этого метода является то, что обработка кода громоздка и не очень лаконична.

Итак, в этом случае вы действительно можете использоватьУсловный оператор, установите нулевое значение по умолчанию, чтобы избежать нулевых указателей при последующей обработке.

// 第一种 if 判空
String value = map.get("支付");
// 第二种 条件运算符
value = Objects.isNull(value) ? "" : value;

Этот метод относительно прост, поэтому я предпочитаю использовать его в повседневной разработке.

ps: Предпосылка здесь в том, что пустые строки не имеют особого значения для бизнеса. Если есть особое значение, его нельзя использовать таким образом.

Тогда, если мы используем JDK8, это на самом деле очень удобно, мы можем использоватьMap#getOrDefaultПрямая замена условного оператора.

// 等同于条件运算符的效果: Objects.isNull(value) ? "" : value;
String value = map.getOrDefault("支付","");

с помощьюMap#getOrDefaultПрямая линия кода, чтобы получить, это просто.

Если вы все еще используете версию до JDK8, этот метод использовать нельзя. Неважно, мы можем использовать ApacheCommon-Lang3предоставленные инструментыMapUtilsИзбегайте нулевых указателей.

// Apache MapUtils
String value = MapUtils.getString(map, "支付", "");

MapUtilsЭтот служебный класс относится кMap#getOrDefaultЕсть выгода, для входящихMapзаnullслучае можно установить значение по умолчанию.

Допустим, мы изPOJOприобретение объектаMapПараметры, в настоящее время, чтобы предотвратить нулевые указатели, нам нужно заранее определить нулевой указатель.

Однако, если вы используетеMapUtils, то нам не нужно судить о том,null, эта логика была инкапсулирована внутри метода.

MapUtils.getString(pojo.getMap(),"支付", "");

Используя Computefabsent.

В повседневной разработке мы будем сталкиваться с такими сценариями, когда ключ необходимо сопоставить с несколькими значениями.В настоящее время мы можем использоватьMap<K, List<V>>эта структура.

При добавлении элементов в это время нам нужно сделать некоторые выводы.Когда внутренние элементы не существуют, мы будем активно создавать объект коллекции.Пример кода выглядит следующим образом:

Map<String, List<String>> map = new HashMap();

List<String> classify = map.get("java框架");
if (Objects.isNull(classify)) {
    classify = new ArrayList<>();
    classify.add("Spring");
    map.put("java框架", classify);
} else {
    classify.add("Spring");
}

Приведенный выше код более громоздкий, и в JDK8Mapдобавить однуcomputeIfAbsentметод:

default V computeIfAbsent(K key,
        Function<? super K, ? extends V> mappingFunction) {

еслиMapсерединаkeyсоответствующийvalueне существует,mappingFunctionРезультирующее значение расчета сохраняется как этоkeyизvalueи вернуть это значение. В противном случае расчет не будет выполнен, и он вернется напрямуюkeyсоответствующее значение.

Используя эту функцию, мы можем напрямую использоватьMap#computeIfAbsentОдна строка кода завершает вышеуказанный сценарий, код выборки выглядит следующим образом:

map.computeIfAbsent("java框架", key -> new ArrayList<>()).add("Spring");

Это на самом делеMapЕсть еще один метод вputIfAbsent, функция сcomputeIfAbsentотносительно похожи.

Когда я впервые начал использовать его, я ошибочно подумал, что его можно использовать.putIfAbsentЗавершение вышеуказанных требований:

// ERROR:会有 NPE 问题
map.putIfAbsent("java框架", new ArrayList<>()).add("Spring");

Это на самом деле неправильно, когдаMapсерединаkeyсоответствоватьvalueНе существует,putIfAbsentвернется прямоnull.

иcomputeIfAbsentвернусьmappingFunctionЗначение после расчета, как и в приведенном выше сценарии, возвращается напрямуюnew ArrayList.

Этот момент требует внимания, не используйте неправильный метод, что приведет к нулевому указателю.

Наконец, для приведенного выше ключа, который необходимо сопоставить с несколькими значениями, на самом деле есть лучшее решение, использующее новый тип коллекции, предоставляемый Google Guava.Multiset, чтобы быстро выполнять сценарии, в которых ключ необходимо сопоставить с несколькими значениями.

Пример кода выглядит следующим образом:

ArrayListMultimap<Object, Object> multiset= ArrayListMultimap.create();
multiset.put("java框架","Spring");
multiset.put("java框架","Mybatis");
// java框架--->Spring,Mybatis

статистика слов

Предполагая следующие требования, нам нужно подсчитать количество вхождений связанных слов в фрагменте текста. Реализация на самом деле очень проста, используяMapДостаточно сохранить количество связанных слов.Пример кода выглядит следующим образом:

Map<String, Integer> countMap = new HashMap();
Integer count = countMap.get("java");
if (Objects.isNull(count)) {
    countMap.put("java", 1);
} else {
    countMap.put("java", count++);
}

Этот код выглядит знакомым? Тоже более сложный.

Далее мы можем использовать JDK8MapДобавьте новый метод для преобразования, на этот раз используя тот, который использовался выше.getOrDefaultплюсputМетод быстро решить, пример кода выглядит следующим образом:

// getOrDefault
Integer count = countMap.getOrDefault("java",0);
countMap.put("java", count + 1);

На самом деле, есть способ, которым мы, на этот раз мы используемMap#mergeЭтот новый метод, одна строка кода завершает вышеуказанные требования, пример кода выглядит следующим образом:

countMap.merge("java", 1, Integer::sum);

Серьезно, только что увиделmergeЭтот метод все еще немного сбивает с толку, особенно когда он используется непосредственно позже.lambdaфункции, это не легко понять.

Здесь сначалаlambdaФункция восстановлена ​​до нормального класса, и я объясню вам этот метод:

countMap.merge("java", 1, new BiFunction<Integer, Integer, Integer>() {
    @Override
    public Integer apply(Integer oldValue, Integer newValue) {
        return Integer.sum(oldValue,newValue);
    }
});

Используйте код выше, чтобы объяснитьmergeметод, еслиjavaЭто значение находится вcountMapне существует в , то соответствующее емуvalueУстановите на 1.

что еслиjavaсуществуетcountMapсуществует, третий параметр называетсяremappingFunction метод функции для расчета.

remappingFunctionв функции,oldValueпредставлять оригиналcountMapсерединаjavaзначение ,newValueЗадаем второй параметр от нашего имени1Здесь мы будем двумя вместе, просто чтобы завершить совокупный спрос.

Наконец

На этот раз я в основном начинаю с трех сценариев, с которыми сталкиваюсь в своей повседневной жизни, и сравниваю использование JDK8 для всех.MapНовый метод - это только разница между двумя кодами.

Из вышеизложенного очевидно, что после использования нового метода мы можем завершить его очень небольшим количеством кода, и общий вид становится очень лаконичным.

Однако многие методы будут использоваться после JDK8.lambdaФункция, если вы с ней не знакомы, понять код на самом деле сложнее.

Но это также хорошо, нам нужно только практиковать в ежедневном процессе кодирования, вскоре вы можете подняться.

Наконец, JDK8 есть много полезных методов, сознательно упрощайте разработку кода, вы можете порекомендовать несколько его в области комментариев?

Добро пожаловать, чтобы обратить внимание на мой официальный аккаунт: Xiaohei в 11:30, чтобы получить ежедневный толчок галантерейных товаров. Если вас интересует мой рекомендуемый контент, вы также можете подписаться на мой блог:studyidea.cn