JAVA之函数编程

q1871901600 发布于 2024-09-29 20 次阅读


FunctionalInterface改造异常抛出

改造前:

if (null != map) {
    throw new RuntimeException("含有转码文件,不可转码!");
}

改造后:

@FunctionalInterface
public interface ThrowExceptionFunction {
    /**
     * 抛出异常
     * @param message 抛出的异常信息
     */
    void throwExceptionMessage(String message);
}

VUtils工具类定义方法

public static ThrowExceptionFunction isTrue(Boolean b) {
    return (errorMsg)->{
        if (b) {
            throw new RuntimeException(errorMsg);
        }
    };
}

VUtils.isTrue(flag).throwExceptionMessage("含有转码文件,不可转码!");

Runnable改造多重if-else

改造前:

if (flag) {
    Map<String, Object> map = FfmpegUtil.ffmpegTaskMap.get(fileMsg.getLink());
    // 含有转码文件且有转码记录
    if (null != map) {
        String transcode = (String) map.get("flag");
        fileMsg.setTranscode(transcode);
    }
    // 含有转码文件但没有转码记录,说明之前已完成转码
    else {
        fileMsg.setTranscode("complete");
    }
}
// 没有转码文件说明可转码
else {
    fileMsg.setTranscode("transcodable");
}

改造后:

@FunctionalInterface
public interface BranchHandle {
    void trueOrFalseHandle(Runnable trueHandle, Runnable falseHandle);
}

VUtils工具类定义方法

public static BranchHandle isTrueOrFalse(Boolean b) {
    return (trueHandle,falseHandle)->{
        if (b) {
            trueHandle.run();
        } else {
            falseHandle.run();
        }
    };
}
VUtils.isTrueOrFalse(flag).trueOrFalseHandle(() -> {
    Map<String, Object> map = FfmpegUtil.ffmpegTaskMap.get(fileMsg.getLink());
    // 含有转码文件且有转码记录
    VUtils.isTrueOrFalse(null != map).trueOrFalseHandle(()->{
        String transcode = (String) map.get("flag");
        fileMsg.setTranscode(transcode);
    }, () -> fileMsg.setTranscode("complete"));
}, () -> fileMsg.setTranscode("transcodable"));

Consumer处理逻辑

改造前:

if (null != map) {
        String transcode = (String) map.get("flag");
        fileMsg.setTranscode(transcode);
    }
    // 含有转码文件但没有转码记录,说明之前已完成转码
    else {
        fileMsg.setTranscode("complete");
    }

改造后:

/**
 * 空值与非空值分支处理
 */
public interface PresentOrElseHandler<T extends Object> {
    /**
     * 值不为空时执行消费操作
     * 值为空时执行其他的操作
     *
     * @param action 值不为空时,执行的消费操作
     * @param emptyAction 值为空时,执行的操作
     * @return void
     **/
    void presentOrElseHandle(Consumer<? super T> action, Runnable emptyAction);
}

VUtils工具类定义方法

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

    return (consumer, runnable) -> {
        if (null != map){
            runnable.run();
        } else {
            consumer.accept(map);
        }
    };
}

使用:

VUtils.isBlankOrNoBlank(map).presentOrElseHandle(this::outputMap, () -> fileMsg.setTranscode("complete"));
private void outputMap(Object o) {
    Map<String, Object> map = (Map<String, Object>) o;
    String transcode = (String) map.get("flag");
    fileMsg.setTranscode(transcode);
}