Используйте «Функция», чтобы исключить if...else

Java задняя часть

Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность.

Часто используется при разработкеif...else...Выполнять такие операции, как вынесение суждений об исключениях, обработка ветвей и т. д. Этиif...else...Заполнение кода серьезно влияет на красоту кода кода.В это время мы можем использоватьJava 8изFunctionинтерфейс для уничтоженияif...else....

if (...){
    throw new RuntimeException("出现异常了");
} 

if (...){
    doSomething();
} else {
    doOther();
}

Functionфункциональный интерфейс

использовать аннотации@FunctionalInterfaceID и содержит только один抽象方法Интерфейс函数式接口.函数式接口в основном разделеныSupplierфункция снабжения,Consumerфункция потребления,Runnableфункция без аргументов, без возврата иFunctionФункция, которая имеет параметры и возвращает.

Functionможно рассматривать как функцию преобразования

Supplierфункция снабжения

SupplierФорма выражения такова, что оно не принимает параметры и только возвращает данныеimage.png

Consumerпотребляющая функция

Consumerпотребляющие функции иSupplierКак раз наоборот.ConsumerПринимает один параметр, без возвращаемого значения

image.png

Runnableфункция без аргументов, без возврата

RunnableФорма выражения заключается в том, что нет ни параметра, ни возвращаемого значения.image.png

FunctionФункция принимает форму параметра и возвращает значение.Supplier,ConsumerиRunnableможно рассматривать какFunctionособая форма

image.png

Используйте маленькие хитрости

Обработка, если выдает исключение

  1. определить функцию

Определите форму, которая выдает исключение函数式接口, этот интерфейс имеет только параметры и не возвращает значения.消费型接口

/**
 * 抛异常接口
 **/
@FunctionalInterface
public interface ThrowExceptionFunction {

    /**
     * 抛出异常信息
     *
     * @param message 异常信息
     * @return void
     **/
    void throwMessage(String message);
}
  1. написать метод оценки

Создать класс инструментовVUtilsи создатьisTureметод, возвращаемое значение метода только что определено函数式接口-ThrowExceptionFunction.ThrowExceptionFunctionЛогика реализации интерфейса такова, когда параметрbзаtrueвыдает исключение

/**
 *  如果参数为true抛出异常
 * 
 * @param b 
 * @return com.example.demo.func.ThrowExceptionFunction
 **/
public static ThrowExceptionFunction isTure(boolean b){

    return (errorMessage) -> {
        if (b){
            throw new RuntimeException(errorMessage);
        }
    };
}
  1. Как пользоваться

После вызова параметра параметра класса инструмента вызовите函数式接口изthrowMessageМетод передает информацию об исключении. Когда входные и выходные параметрыfalseнормальное исполнениеimage.png

Когда входные и выходные параметрыtrueвыдает исключениеimage.png

Обработка операций ветвления

  1. Определить функциональный интерфейс

СоздатьBranchHandleФункциональный интерфейс интерфейса принимает два параметраRunnableинтерфейс. эти двое двоеRunnableИнтерфейс представляет собойtrueилиfalseдействие, которое нужно предпринять, когда

/**
 * 分支处理接口
 **/
@FunctionalInterface
public interface BranchHandle {

    /**
     * 分支操作
     *
     * @param trueHandle 为true时要进行的操作
     * @param falseHandle 为false时要进行的操作
     * @return void
     **/
    void trueOrFalseHandle(Runnable trueHandle, Runnable falseHandle);

}
  1. написать метод оценки

СоздатьisTureOrFalseметод, возвращаемое значение метода только что определено函数式接口-BranchHandle.

/**
 * 参数为true或false时,分别进行不同的操作 
 * 
 * @param b 
 * @return com.example.demo.func.BranchHandle     
 **/
public static BranchHandle isTureOrFalse(boolean b){
    
    return (trueHandle, falseHandle) -> {
        if (b){
            trueHandle.run();
        } else {
            falseHandle.run();
        }
    };
}
  1. Как пользоваться

Параметрыtrueкогда, выполнитьtrueHandle image.png

Параметрыfalseкогда, выполнитьfalseHandle image.png

Если есть значение, выполните потребляющую операцию, в противном случае выполните операцию с нулевым значением.

  1. определить функцию

СоздатьPresentOrElseHandlerФункциональный интерфейс интерфейса, одним из параметров интерфейса являетсяConsumerинтерфейс. один дляRunnable, соответственно представляющие операцию потребления, когда значение не пусто, и другие операции, выполняемые, когда значение пусто

/**
 * 空值与非空值分支处理
 */
public interface PresentOrElseHandler<T extends Object> {

    /**
     * 值不为空时执行消费操作
     * 值为空时执行其他的操作
     * 
     * @param action 值不为空时,执行的消费操作
     * @param emptyAction 值为空时,执行的操作
     * @return void    
     **/
   void presentOrElseHandle(Consumer<? super T> action, Runnable emptyAction);
   
}
  1. написать метод оценки

СоздатьisBlankOrNoBlankметод, возвращаемое значение метода только что определено函数式接口-PresentOrElseHandler.

/**
 * 参数为true或false时,分别进行不同的操作
 *
 * @param b
 * @return com.example.demo.func.BranchHandle
 **/
public static PresentOrElseHandler<?> isBlankOrNoBlank(String str){

    return (consumer, runnable) -> {
        if (str == null || str.length() == 0){
            runnable.run();
        } else {
            consumer.accept(str);
        }
    };
}
  1. Как пользоваться

После вызова параметра параметра класса инструмента вызовите函数式接口изpresentOrElseHandleметод проходит черезConsumerиRunnable

Если параметр не пуст, напечатайте параметрimage.png

Если параметр не пустойimage.png

конец

FunctionФункциональный интерфейс естьjava 8Очень важная функция, воспользуйтесь еюFunctionФункции могут значительно упростить код.