专业的JAVA编程教程与资源

网站首页 > java教程 正文

妙用Java 8中的 Function接口(java里function的作用)

temp10 2025-07-08 22:51:35 java教程 1 ℃ 0 评论

#头条创作挑战赛#

在开发过程中经常会使用if...else...进行判断抛出异常、分支处理等操作。这些if...else...充斥在代码中严重影响了代码代码的美观,这时我们可以利用Java 8的Function接口来消灭if...else...

妙用Java 8中的 Function接口(java里function的作用)

if (...){
    throw new RuntimeException("发生异常了");
} 
//举例
if (...){
    doSomething();
} else {
    doOther();
}

Function 函数式接口

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

提供自定义的函数进行转化

Function<String, Long> fun = x -> DateUtil.parse(x.replaceAll("/", "-"), "yyyy-MM-dd").getTime() / 1000;
//提供传入的时间格式的字符串
fun.apply(param);

Function可以看作转换型函数

Supplier供给型函数

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

/**
*表示结果的提供者。
*<p>不要求每次返回一个新的或不同的结果
*调用供应商的时间。
*<p>这是一个<a href=“package summary.html”>功能界面</a>
*其函数方法为{@link#get()}。
*@param<T>此供应商提供的结果类型
*@自1.8起
*/
@FunctionalInterface
public interface Supplier<T> {

/**
*获取结果。
*@return a结果
*/
    T get();
}
  • 测试代码:
public static void main(String[] args){
    //创建Supplier容器,声明为UserLog类型,此时并不会调用对象的构造方法,即不会创建对象
    Supplier<UserLog> 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}
*通过副作用进行操作。
*<p>这是一个<a href=“package summary.html”>功能界面</a>
*其函数方法为{@link#accept(Object)}。
*@param<T>操作的输入类型
*@自1.8起
*/
@FunctionalInterface
public interface Consumer<T> {

 /**
*对给定参数执行此操作。
*@param t输入参数
*/
    void accept(T t);

   /**
*返回按顺序执行以下操作的组合{@code Consumer}
*操作后跟{@code-after}操作。如果执行以下任一操作
*操作抛出异常,它被中继到
*组合操作。如果执行此操作会引发异常,
*不会执行{@code-after}操作。
*@param在操作后执行此操作后
*@return一个按顺序执行此操作的组合{@code消费者}
*操作后跟{@code-after}操作
*如果{@code-after}为空,@throws NullPointerException
*/
    default Consumer<T> andThen(Consumer<? super T> after) {
        Objects.requireNonNull(after);
        return (T t) -> { accept(t); after.accept(t); };
    }
}

例子:

Consumer<String> nameConsumer = s -> System.out.println(s);
nameConsumer.accept("张三");
nameConsumer.accept("李四");
System.out.println("===================");
List<Integer> numList = Arrays.asList(1, 2, 3, 4);
Consumer<List<Integer>> squareConsumer = list -> {
    for (int i = 0; i < list.size(); i++) {
        list.set(i, list.get(i) * list.get(i));
    }
};
Consumer<List<Integer>> 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("运行时异常");
}

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

欢迎 发表评论:

最近发表
标签列表