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