JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

妙用Java 8中的 Function接口

wys521 2025-03-12 21:28:15 精选教程 178 ℃ 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 fun = x -> DateUtil.parse(x.replaceAll("/", "-"), "yyyy-MM-dd").getTime() / 1000;
//提供传入的时间格式的字符串
fun.apply(param);

Function可以看作转换型函数

Supplier供给型函数

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

/**
*表示结果的提供者。
*

不要求每次返回一个新的或不同的结果 *调用供应商的时间。 *

这是一个功能界面 *其函数方法为{@link#get()}。 *@param此供应商提供的结果类型 *@自1.8起 */ @FunctionalInterface public interface Supplier { /** *获取结果。 *@return a结果 */ T get(); }

  • 测试代码:
public static void main(String[] args){
    //创建Supplier容器,声明为UserLog类型,此时并不会调用对象的构造方法,即不会创建对象
    Supplier sup=UserLog::new;
    //调用get()方法,此时会调用对象的构造方法,即获得到真正对象
    UserLog userLog=sup.get();
    userLog.setId(1);
    System.out.println(userLog);
    //每次get都会调用构造方法,即获取的对象不同
    System.out.println(sup.get());
}
  • 输出结果

Consumer消费型函数

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

/**
*表示接受单个输入参数并返回no的操作
*结果。与大多数其他功能接口不同,需要{@codeConsumer}
*通过副作用进行操作。
*

这是一个功能界面 *其函数方法为{@link#accept(Object)}。 *@param操作的输入类型 *@自1.8起 */ @FunctionalInterface public interface Consumer { /** *对给定参数执行此操作。 *@param t输入参数 */ void accept(T t); /** *返回按顺序执行以下操作的组合{@code Consumer} *操作后跟{@code-after}操作。如果执行以下任一操作 *操作抛出异常,它被中继到 *组合操作。如果执行此操作会引发异常, *不会执行{@code-after}操作。 *@param在操作后执行此操作后 *@return一个按顺序执行此操作的组合{@code消费者} *操作后跟{@code-after}操作 *如果{@code-after}为空,@throws NullPointerException */ default Consumer andThen(Consumer after) { Objects.requireNonNull(after); return (T t) -> { accept(t); after.accept(t); }; } }

例子:

Consumer nameConsumer = s -> System.out.println(s);
nameConsumer.accept("张三");
nameConsumer.accept("李四");
System.out.println("===================");
List numList = Arrays.asList(1, 2, 3, 4);
Consumer<List> squareConsumer = list -> {
    for (int i = 0; i < list.size(); i++) {
        list.set(i, list.get(i) * list.get(i));
    }
};
Consumer<List> printConsumer = list -> list.forEach(n -> System.out.println(n));
squareConsumer.andThen(printConsumer).accept(numList);

输出结果:

使用小技巧

处理抛出异常的if

/**
 * 抛异常接口
 * 定义一个抛出异常的形式的函数式接口, 这个接口只有参数没有返回值是个消费型接口
 **/
@FunctionalInterface
public interface ThrowExceptionFunction {

    /**
     * 抛出异常信息
     * @param message 异常信息
     * @return void
     **/
    void throwMessage(String message);
}

/**
 *  如果参数为true抛出异常
 * 创建一个isTure方法,方法的返回值为刚才定义的函数式接口-ThrowExceptionFunction。
 * ThrowExceptionFunction的接口实现逻辑为当参数i大于j时抛出异常
 * @param i,j
 **/
public static ThrowExceptionFunction isTure(int i,int j){

    return (errorMessage) -> {
        if (i>j){
            throw new RuntimeException(errorMessage);
        }
    };
}

public static void main(String[] args){
  //调用方法,传入参数后,调用函数式接口的throwMessage方法传入异常信息
    TestController.isTure(10,5).throwMessage("运行时异常");
}

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表