概述
今天在梳理公司老项目的过程中,发现了一部分代码冗余度比较高,一个方法里面写了很多遍记录方法耗时的代码,想着优化一下。由于项目比较老,又不想动太多,所以和公司大佬讨论了以下,给了我一个解决方法用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类型的参数,还可以自己封装多个参数的,目前封装好的最多两个入参,多个方法还能配合使用。