JAVA-Function基础使用

本文介绍了如何在Java8的Function接口及其相关类(如BiFunction和Consumers)中,通过lambda表达式优化代码,减少方法间记录耗时的冗余。作者展示了如何使用这些工具简化方法调用并提高代码可读性。
摘要由CSDN通过智能技术生成

概述

今天在梳理公司老项目的过程中,发现了一部分代码冗余度比较高,一个方法里面写了很多遍记录方法耗时的代码,想着优化一下。由于项目比较老,又不想动太多,所以和公司大佬讨论了以下,给了我一个解决方法用java.util.function里面的一些方法。

介绍

Function接口是Java 8中的一个函数式接口,个人理解,可以把定义方法转为一个Function,然后当作参数,进行传递。

java.util.function包下面方法有很多,今天先浅浅的介绍以下四种我用到的类:

1、Function(一个入参有返回结果)

2、BiFunction(两个入参有返回结果)

2、Cornsume(一个入参无返回结果)

3、BiCornsume(两个入参无返回结果)

示例

优化前示例

可以看到,每个方法一次记录,那么就代表每个方法调用都需要写至少4行进行使用,冗余度新高

    public static void main(String[] args) {
        final Long staTime = System.currentTimeMillis();
        Demo2.test1("方法1");
        final Long endTime = System.currentTimeMillis();
        System.out.println(String.format("方法1耗时%s",endTime - staTime));

        final Long staTime2 = System.currentTimeMillis();
        Demo2.test1("方法2");
        final Long endTime2 = System.currentTimeMillis();
        System.out.println(String.format("方法2耗时%s",endTime2 - staTime2));
    }

Function封装示例

附上一个demo,当前demo中是我封装的上面4个类的方法。

import java.util.function.*;

/**
 * @author 崔
 * @version 0.0.1
 * @Date 2023/8/15 19:51
 */
public class Demo {


     /**
     * 一个入参有返回值
     *
     * @param functionName    名称
     * @param t        入参
     * @param function 方法
     * @param <R>      返回结果
     * @return R
     */
    public static <T, R> R oneValue(final String functionName,
                             final T t, final Function<T, R> function) {
        final Long staTime = System.currentTimeMillis();
        final R r = function.apply(t);
        final Long endTime = System.currentTimeMillis();
        System.out.println(String.format("方法%s耗时%s",functionName,endTime - staTime));
        return r;
    }

    /**
     * 两个入参一个返回值
     *
     * @param functionName    方法名称
     * @param t        审核入参
     * @param u        通用的service
     * @param function 方法
     * @param <R>      返回结果
     * @return R
     */
    public static <T, U, R> R twoValue(final String functionName,
                                final T t,
                                final U u,
                                final BiFunction<T, U, R> function) {
        final Long staTime = System.currentTimeMillis();
        final R r = function.apply(t, u);
        final Long endTime = System.currentTimeMillis();
        System.out.println(String.format("方法%s耗时%s",functionName,endTime - staTime));
        return r;
    }

    /**
     * 一个入参没有返回值
     *
     * @param functionName
     * @param t
     * @param function
     */
    public static <T> void oneNot(final String functionName,
                           final T t,
                           final Consumer<T> function) {
        final Long staTime = System.currentTimeMillis();
        function.accept(t);
        final Long endTime = System.currentTimeMillis();
        System.out.println(String.format("方法%s耗时%s",functionName,endTime - staTime));
    }

    /**
     * 两个入参没有返回值
     *
     * @param functionName
     * @param t
     * @param u
     * @param function
     * @param <T>
     * @param <U>
     */
    public static <T, U> void twoNot(final String functionName,
                              final T t,
                              final U u,
                              final BiConsumer<T, U> function) {
        final Long staTime = System.currentTimeMillis();
        function.accept(t, u);
        final Long endTime = System.currentTimeMillis();
        System.out.println(String.format("方法%s耗时%s",functionName,endTime - staTime));
    }
}

优化后示例

优化后,代码不但减少,而且更美观。

    public static void main(String[] args) {
        Demo.oneValue("方法1", "入参", Demo2::test1);//一个入参有返回值
        Demo.twoValue("方法2", "入参1", "入参2", Demo2::test2);//两个入参有返回值
        Demo.oneNot("方法1", "入参", Demo2::test3);//一个入参没返回值
        Demo.twoNot("方法2", "入参1", "入参2", Demo2::test4);//两个入参没返回值
    }

总结

对于Function包中,还有很多其他的方法,比如返回boolean类型的参数,还可以自己封装多个参数的,目前封装好的最多两个入参,多个方法还能配合使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值