Оригинал: Miss Sister Taste (идентификатор публичной учетной записи WeChat: xjjdog), добро пожаловать, пожалуйста, сохраните источник для перепечатки. Любое воспроизведение, которое не содержит этого утверждения, является плагиатом.
Факультатив Java очень прост в использовании. Обычно мы используем необязательный для непустой обработки, опуская обработку. Основная цель — решить пресловутое исключение нулевого указателя в Java.
Например, при обычном кодировании мы часто сталкиваемся с ненулевыми оценками входных параметров.
public void getXXX(Map<String, String> params) {
Map<String, String> map = params;
if (map == params) {
map = new HashMap<>();
}
}
Как только будет еще один такой код, наша программа будет медленно стать горой дерьмой. В это время вы можете использовать необязательный для преобразования.
public void getXXX(Map<String, String> params) {
Map<String, String> map = Optional.ofNullable(params).orElse(new HashMap<>());
}
Меньше строк кода, понятнее логика и ниже собственная производительность :).
1. Сложный пример
Давайте рассмотрим более сложный пример.
Предположим, нам нужен более глубокий уровень данных.
String cityCode = customer.getAddress().getCity().getCityCode().substring(0,3);
Это приобретение нецелесообразно, так как одно из колец, которое может быть пустым, выдаст нулевой указатель. Поэтому нам нужно делать выводы слой за слоем.
public void getCityCode(Customer customer) {
String cityCode = "000";
if (customer != null) {
Address address = customer.getAddress();
if (null != address) {
City city = address.getCity();
if (city != null) {
String code = city.getCityCode();
if (null != code && code.length() >= 3) {
cityCode = code.substring(0, 3);
}
}
}
}
System.out.println(cityCode);
}
Используя лямбда-синтаксис Optional, мы можем изменить код так, чтобы он выглядел так:
public void getCityCode(Customer customer) {
String cityCode = Optional.ofNullable(customer)
.map(c -> c.getAddress())
.map(a -> a.getCity())
.map(c -> c.getCityCode())
.filter(s -> s.length() >= 3)
.map(s -> s.substring(0, 3))
.orElse("000");
}
Код красивый?
Хотя внешний вид высокий, ниже приведены некоторые ключевые моменты боковой двери.
2. Скрытое содержимое опциона
На самом деле, до выпуска Java8 (2014) в гуаве были похожие инструменты, но поскольку в то время не было лямбда-синтаксиса, она могла делать только некоторые простые приложения.
Необязательный параметр Guava поддерживает сериализацию и может быть возвращен в методах инфраструктуры RPC, но обычно используется редко.
Необязательный Java вообще не может быть сериализован. Почему java8 Optional не реализует сериализацию, здесь есть обсуждение, вы можете посмотретьКупил .open JDK.Java.net/Piper mail/ просто…
Кроме того, Java8 — это нечто большее, чем GUAVA, etcchap или Setthrow эти методы. Ввиду нынешних людей, которые используют Guava Optional, все меньше и меньше.
Необязательный будет оказывать некоторое давление на GC. Если вы разрабатываете базовую структуру, вы должны использовать ее осторожно. Netty была протестирована и, наконец, отказалась от необязательных.
Но мне все равно нравится им пользоваться. Кто сделал большую часть отечественных Cruders?
3. Что такое попробовать?
После использования Javaer, который долгое время использовал Java-кодирование, у него возникнут удивительные ощущения после того, как он увидит такие языки, как Scala и Kotlin. Но эти сумки действительно слишком велики, и их введение требует определенных затрат, поэтому они могут только жаждать своих тел.
Однако стандартная библиотека Java имеет относительно ограниченную поддержку API для функционального программирования. Есть ли легкий способ улучшить нашу библиотеку Java? Было бы еще лучше, если бы его можно было комбинировать с лямбда-выражениями. Vavr — это такой простой пакет Jar, который делает наш код более плавным в написании.
Его координаты maven:
<dependency>
<groupId>io.vavr</groupId>
<artifactId>vavr</artifactId>
<version>0.10.3</version>
</dependency>
Вот фрагмент кода для отличного метода сортировки сна:
public class SleepSort implements Runnable {
private int num;
public SleepSort(int num) {
this.num = num;
}
@Override
public void run() {
try {
Thread.sleep(num * 10);
} catch (Exception e) {
e.printStackTrace();
}
System.out.print(num + " ");
}
public static void main(String[] args) {
int[] nums = {5, 22, 10, 7, 59, 3, 16, 4, 11, 8, 14, 24, 27, 25, 26, 28, 23, 99};
Arrays.stream(nums).forEach(n->new Thread(new SleepSort(n)).start());
}
}
В части Run слишком много бесполезной информации, мы можем использовать Try, чтобы преобразовать ее.
Мы можем упростить его до следующих двух строк:
Try.run(()->Thread.sleep(num*10))
.andThen(()->System.out.print(num + " "));
Он поддерживает очень большое количество методов и может выполнять большую часть последующей бизнес-обработки. Например, в методе onFailure добавьте регистрацию информации об исключении.
Обычная обработка jackson json может быть упрощена до следующего кода:
String json = Try.of(() -> objectMapper.writeValueAsString(str)).getOrElse("{}");
Попытка так полезно. Кроме того, Vavr составляет всего более 800 кВ.
4. Больше операций vavr
vavr поддерживает Tuple (кортеж), Option, Try, Does, удобные операции set, многовариантные функции, каррирование и т. д.
Взгляните на vavr-версию if else. Ниже приведен код для четырех ветвей. Эти странные символы в нем доказывают, что это просто синтаксический сахар.
public String vavrMatch(String input) {
return Match(input).of(
Case($("a"), "a1"),
Case($("b"), "b2"),
Case($("c"), "c3"),
Case($(), "unknown")
);
}
В другом примере, если вы хотите определить функцию, а не класс, вы можете использовать функцию в Java. Но, к сожалению, функция Java поддерживает только один параметр.
Используя функцию Vavr, поддерживает до 22 параметров!
В качестве другого примера вы хотите вернуть несколько значений в методе. Это легко реализовать в Python, но в Java вам нужно определить класс для его получения.
Кортеж может поддерживать комбинацию нескольких возвращаемых значений. Например следующий код:
// (Java, 8)
Tuple2<String, Integer> java8 = Tuple.of("Java", 8);
// "Java"
String s = java8._1;
// 8
Integer i = java8._2;
vavr поддерживает возврат 8 значений сразу.
Кроме того, есть такие гаджеты, как ленивые. Например, отложенная выборка значений.
Lazy<Double> lazy = Lazy.of(Math::random);
lazy.isEvaluated(); // = false
lazy.get(); // = 0.123 (random generated)
lazy.isEvaluated(); // = true
lazy.get(); // = 0.123 (memoized)
Таких способов расширения много. Но больше всего я использую Try и кортежи. Это делает код более элегантным и более четко выражает намерение.
О верно. resilience4j активно использует vavr, который является официально рекомендуемым компонентом предохранителей после того, как Hystrix больше не обновляется.
Об авторе:Мисс сестра вкус(xjjdog), публичная учетная запись, которая не позволяет программистам идти в обход. Сосредоточьтесь на инфраструктуре и Linux. Десять лет архитектуры, десятки миллиардов ежедневного трафика, обсуждение с вами мира высокой параллелизма, дающие вам другой вкус. Мой личный WeChat xjjdog0, добро пожаловать в друзья для дальнейшего общения.