【java】总结Java中那些你应该知道的方法

bean拷贝、转换相关

  1. BeanUtils.copyProperties(Object source, Object target)
    将source和target实体类中共有的字段进行复制,spring-beans包下的工具类,底层原理也比较简单 反射判断属性名, 也有可能会遇到坑,例如get set方法名不正确 BeanUtils.copyProperties为null的问题
  2. new DefaultMapperFactory.Builder().build().getMapperFacade().map(Object source, Target.class)
    与BeanUtils 相比 这个方法可以自定义转换字段名 并且基于javassist技术, beanutils是基于反射的,例如源实体类字段是num 我们需要复制到目标实体的age字段,此外还可以复制 List<?> 方法:
    new DefaultMapperFactory.Builder().build().getMapperFacade().mapAsList(Object source, Target.class)
   public void mapperFactory() {
        DefaultMapperFactory factory = new DefaultMapperFactory.Builder().build();

        // Import 实体类里面存在有int num 字段 ; People实体类存在 int age字段
        Import it = new Import();
        it.setNum(11);
        // 需要拷贝不同字段名时的处理
        factory.classMap(Import.class,People.class).field("num","age").byDefault().register();
        People peopleAfter = factory.getMapperFacade().map(it, People.class);
        // 此时 peopleAfter.age == it.num == 11
        System.out.println(peopleAfter);

    }

需要使用orika-core jar包 , maven依赖如下

        <dependency>
            <groupId>ma.glasnost.orika</groupId>
            <artifactId>orika-core</artifactId>
            <version>1.5.4</version>
        </dependency>
  1. 实体类转map 并忽略空字段
    (需要fastjson依赖)

		// 实体类
        Oper oper = new Oper();
        oper.setTestXxx("");
        oper.setTestDesc("1");
        oper.setGroupId(null);

        PropertyFilter filter = (source, name, value) -> {
            // 忽略为 null 的字段( String 类型还需要忽略空字符串)
            if (null == value || ((value instanceof String) && ((String) value).isEmpty())) {
                return false;
            }
            return true;
        };
		// 实体类转map
        Map params = JSON.parseObject(JSON.toJSONString(oper, filter), Map.class);
    

配置文件加载相关

  1. Properties prop = PropertiesLoaderUtils.loadAllProperties("yourDirName/xx.properties");
    动态加载配置文件,即配置文件加载,可以实时读取到,原理是因为每次classLoader会去重新加载 , 参数为配置文件的相对路径, spring-core包下的工具类
  2. ResourceBundle bundle = ResourceBundle.getBundle("xx"); String name = bundle.getString("name");
    简洁的代码加载资源路径根目录下的xx.properties配置文件(非动态),例如xx配置中存在某个key为 “name”,想要获取value, 可以使用上述方法,java.util下的类

函数式相关

  1. ::参数转成String ,双冒号参数优点不言而喻。
    /**
     * Description: 函数式参数转回String属性名
     * date: 2021/06/09 12:05
     *
     * @param sFunctionField
     * @return
     * @author qkj
     */

    public static <T> String function2Str(SFunction<T, ?> sFunctionField) {
        Method writeReplace = null;
        try {
            // 函数式方法可以直接调用writeReplace
            writeReplace = sFunctionField.getClass().getDeclaredMethod("writeReplace");
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        writeReplace.setAccessible(true);
        String fieldName = "";
        try {
            // 序列化
            Object object = writeReplace.invoke(sFunctionField);
            // 反序列化
            SerializedLambda serializedLambda = (SerializedLambda) object;
            String methodName = serializedLambda.getImplMethodName();
            String temp = methodName.substring(3);
            fieldName = temp.replaceFirst(temp.substring(0, 1), temp.substring(0, 1).toLowerCase());
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

        return fieldName;

    }

java中使用groovy脚本 上述代码不再适用 , groovy版:



    /**
     * 在groovy里面使用mybatis plus 构造器
     * java标准包的lambda方式和groovy有差异
     * usage:  GroovyShell.parse方式调试得出本方法,不保证其它方式生成的 Script 也能使用; 其它方式需要重新调试具体源代码
     * @param function
     * @author git: qiuhuanhen  csdn: 孟秋与你
     */
    public static <T> String function2StrInGroovy(Function<T, ?> function) {

        InvocationHandler handler = Proxy.getInvocationHandler(function);

        // 从本类、父类中查找方法
        Method[] methods = handler.getClass().getMethods();
        for (Method method : methods) {
            if (Objects.equals("getDelegate",method.getName())) {
                // 拿到了getDelegate方法
                // 使用反射调用 getDelegate 方法
                MethodClosure delegate = null;
                try {
                    delegate = (MethodClosure) method.invoke(handler);
                } catch (IllegalAccessException | InvocationTargetException e) {
                    throw new RuntimeException(e);
                }
                String methodName = delegate.getMethod();
                String temp = methodName.substring(3);
                temp = temp.replaceFirst(temp.substring(0, 1), temp.substring(0, 1).toLowerCase());
                return temp;
            }
        }
        throw new RuntimeException("can't found method");
    }

optional相关

  1. Optional 类非空处理 jdk8特性 支持对null时的处理,具体可以在博主的主页博客搜optional , 有更详细的介绍
        People people = null;
        String s = Optional.ofNullable(people)
                .map(item -> item.getName())
                .orElse("---");
        // 得到 “---” 字符串
        System.out.println(s);


        List<People> list = null;
        // 得到一个空list对象 而非null值
        List<People> list1 = Optional.ofNullable(list).orElse(new ArrayList<>());
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孟秋与你

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值