JAVA-Function基础使用

概述

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MybatisPlus的SFunction是一个函数式接口,可以在Lambda表达式中使用。它的作用是将一个实体类的属性转化为数据库表中的字段名,以便在MybatisPlus的Wrapper查询条件构造器中使用。 SFunction的定义如下: ```java @FunctionalInterface public interface SFunction<T, R> extends Function<T, R>, Serializable { default <V> SFunction<T, V> andThen(Function<? super R, ? extends V> after) { Objects.requireNonNull(after); return t -> after.apply(apply(t)); } } ``` 其中,T表示实体类类型,R表示属性类型。SFunction继承了Java8的Function接口,也就是说它可以作为一个Lambda表达式传递。使用SFunction时,需要重写它的apply方法,将实体类的属性转化为数据库表中的字段名。 例如,我们有一个实体类User,其中有一个属性name: ```java public class User { private Long id; private String name; // getters and setters } ``` 我们可以使用SFunction将它转化为数据库表中的字段名: ```java SFunction<User, ?> nameFunc = User::getName; String columnName = "name"; LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(nameFunc, "Tom"); ``` 在这个例子中,我们创建了一个SFunction对象nameFunc,它将User类的name属性转化为数据库表中的"name"字段名。然后,我们使用LambdaQueryWrapper构造器,将nameFunc作为参数传递给eq方法,构造一个条件查询,查询name等于"Tom"的记录。 ### 回答2: MyBatis Plus中的SFunction是一个函数式接口,用于定义抽象泛型方法。SFunction接受一个参数并返回一个结果,通常用于Lambda表达式中。 SFunction可以在Lambda表达式中的查询条件、更新字段、排序等多个场景中使用。在查询条件中,可以根据实体属性进行比较、筛选和组合;在更新字段中,可以选择要更新的属性;在排序中,可以指定属性的排序方式。 使用SFunction可以简化代码编写,提高代码的可读性和可维护性。通过SFunction,可以直接使用实体类中的属性名作为条件、字段或排序的依据,避免硬编码,减少出错的可能性。 例如,假设我们有一个User实体类,有id、name和age三个属性。如果我们要根据name查询用户列表,可以使用SFunction来完成: ``` List<User> userList = userDao.selectList(new QueryWrapper<User>().lambda() .eq(User::getName, "张三")); ``` 在上面的例子中,我们使用了SFunction表达式`User::getName`来指定查询条件。这样做的好处是,不需要直接使用字符串来表示属性名,提高了代码的可读性和可维护性。 总之,MyBatis Plus中的SFunction可以在Lambda表达式中定义和使用抽象泛型方法,用于简化代码编写、提高代码的可读性和可维护性。 ### 回答3: MybatisPlus SFunction是一个函数式接口,它可以用来对数据进行处理和转化。它的作用是对查询结果集的某个字段进行转换或者处理,然后返回处理后的结果。 SFunction使用很简单,只需要将需要处理的字段作为参数传入一个Lambda表达式中即可。Lambda表达式会对每一条结果记录进行处理,并返回处理后的结果。 对于返回值类型是原始类型的字段(如int、double等),可以直接使用Lambda表达式对其进行处理。 对于返回值类型是对象的字段,可以使用Lambda表达式进行进一步的操作,比如获取其中的某个属性的值。 SFunction的好处是可以在查询结果集的基础上做进一步的处理,并返回处理后的结果。这样可以大大增强了数据的灵活性和可操作性。 总结起来,MybatisPlus SFunction是一个函数式接口,用于对查询结果集中的字段进行处理和转化。它的使用非常简单,只需要将需要处理的字段作为参数传入Lambda表达式中即可。通过SFunction,我们可以对查询结果集进行进一步的操作,增强了数据的灵活性和可操作性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值