找回密码
立即注册
搜索
发回帖 发新帖

6367

积分

1

好友

794

主题
发表于 4 天前 | 查看: 9| 回复: 0

在开发过程中,经常需要借助 if...else... 来完成判断抛出异常、分支处理等操作。这类 if...else... 一旦多起来,代码可读性就会明显下降。其实可以换一种思路:借助 Java 8 的 Function 接口来消灭一部分 if...else...。

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

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

这写法,真牛逼

Function 函数式接口

使用注解 @FunctionalInterface 标识,并且只包含一个抽象方法的接口,就是函数式接口。它主要分为四类:Supplier 供给型函数、Consumer 消费型函数、Runnable 无参无返回型函数,以及 Function 有参有返回型函数。

Function 可以看作转换型函数。

Supplier 供给型函数

Supplier 的表现形式为不接受参数、只返回数据。

Supplier 函数式接口源码

Consumer 消费型函数

Consumer 消费型函数和 Supplier 刚好相反。Consumer 接收一个参数,没有返回值。

Consumer 函数式接口源码

Runnable 无参无返回型函数

Runnable 的表现形式为既没有参数也没有返回值。

Runnable 函数式接口源码

Function 函数

Function 函数的表现形式为接收一个参数,并返回一个值。Supplier、Consumer 和 Runnable 可以看作 Function 的一种特殊表现形式。

Function 函数式接口源码

使用小技巧

处理抛出异常的 if

  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 时,正常执行。

isTure 参数为 false 时测试通过

当传入的参数为 true 时,抛出异常。

isTure 参数为 true 时抛出异常

处理 if 分支操作

  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。

isTureOrFalse 参数为 true 时执行 trueHandle

参数为 false 时,执行 falseHandle。

isTureOrFalse 参数为 false 时执行 falseHandle

如果存在值执行消费操作,否则执行基于空的操作

  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。

参数不为空时,打印参数。

isBlankOrNoBlank 非空字符串输出 hello

参数为空时,执行空操作,输出“空字符串”。

isBlankOrNoBlank 空字符串输出空字符串




上一篇:DNS解析慢、偶尔失败?从resolv.conf到K8s排查路径
下一篇:向量场与势函数怎么判断?多元微积分第14部分核心思路与例题
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-10-4 03:18 , Processed in 0.077145 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表