总结自己开发中,阅读源码中获得的编程技巧

1. scan用来跳出循环

下面是String源码中的应用,通过scan坐标,在符合条件下调到scan位置处。

scan: {
            for (firstLower = 0 ; firstLower < len; ) {
                int c = (int)value[firstLower];
                int srcCount;
                if ((c >= Character.MIN_HIGH_SURROGATE)
                        && (c <= Character.MAX_HIGH_SURROGATE)) {
                    c = codePointAt(firstLower);
                    srcCount = Character.charCount(c);
                } else {
                    srcCount = 1;
                }
                int upperCaseChar = Character.toUpperCaseEx(c);
                if ((upperCaseChar == Character.ERROR)
                        || (c != upperCaseChar)) {
                    break scan;
                }
                firstLower += srcCount;
            }
            return this;
        }

2. BeanUtils.copyProperties(fromObject,toObject)

功能:将fromObject的字段值复制到toObject
这个方法很好用,解决我们很多不必要的代码。但是有个小技巧,这两个对象的字段数量可能不一样,需要复制的字段名称要一样,这样才能复制。有了和这个方法,就不需要我们一个一个的get() set() 方法了。

3. 关于使用mabatis分页,得到的结果转Dto

问题:
用mybatis实现分页后,因为是在持久层进行查询,由于泛型的关系,返回的Page格式,然而前段要获得数据有时远不止entity的字段,所以我们要自定义Dto来封装传到前段的数据,格式为 Page。问题来了,怎么进行转换呢?
关于Dto,可以看我这篇文章。后端传到前段数据Dto

代码如下

public  Page<UserDto> findPage(PageVo pageVo) {
        Page<UserEntity> page = new Page<UserEntity>(pageVo.getIndex(),pageVo.getSize());
        Page<UserEntity> result = operatorTableTempMapper.selectPage(page,null);
        //要封装的数据格式
        Page<UserDto> resultDto= new Page<>();
        //用list来存储每个Dto
        List<UserDto> list= new ArrayList<>();
        result.getRecords().forEach(data->{
            UserDtodto= new UserDto();
            //这里就用到了复制,尽量将两个类相同字段名称定义成一样
            BeanUtils.copyProperties(data,dto);
            if (data.getTableId()!=null && data.getTableId().length()>0) {
            //这里就是对个别字段进行复制了,
                dto.setUserName(UserMapper.selectById(data.getUserId()).getUserName());
            }
            list.add(dto);
        });
        //从新将结果组合成 Page
        resultDto.setRecords(list);
        return resultDto;
    }

基本就是这样了,以后用到mybatis/mybatis-plus分页,进行结果转换可以运用这一套代码。

4 多用lambda表达式

在我现在认识中,运用lambda表达式最多地方

  • 遍历 Set和List集合
  • lambda创建线程
// 遍历集合
List list= new ArrayList();
// 第一种:打印
list.forEach(System.out::println);
// 第二种,可以进行另外操作,在大括号中进行七大操作
list.forEach(data->{
	
})

// 创建线程
new Thread(() -> {
      for (int i = 0; i < 10; i++) {
        System.out.println("数字:"+ i);
      }
    }).start();

除了上面两种常见的用法,还有其他的

  • 集合内元素排序
  • 删除集合中某个元素
		//3. 删除集合中国满足个条件的集合
        lists.removeIf(data->data.getId()==1);
        //4. 集合元素排序
        lists.sort((a,b)->a.getAge()-b.getAge());
        lists.forEach(data-> System.out.println("删除排序后:"+data));

代码集合

其实还有一个重要的应用,但我好像没用到,以后用到再说,有个概念
函数式接口:FunctionInterface

public class lambdaTest {
    public static void main(String[] args) {
        NoReturnNoParam noReturnNoParam=()->{
            System.out.println("第一个lambdal表达式");
        };
        noReturnNoParam.method();

        //1. 遍历集合
        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        List<User> lists= new ArrayList<>();
        for(int i=0;i<5;i++){
            lists.add(new User(i,"固定的",i,"中国"));
        }
        lists.forEach(System.out::println);
        //我比较常用的
        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        lists.forEach(data->{
            //在这里可以进行一些数据的封装
            System.out.println("也可以打印:"+data);
        });

        //2. 创建线程
        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        new Thread(()->{
            for (int i=0; i<5; i++){
                System.out.println("在这里搞事情:"+i);
            }
        }).start();
        System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        //3. 删除集合中国满足个条件的集合
        lists.removeIf(data->data.getId()==1);
        //4. 集合元素排序
        lists.sort((a,b)->a.getAge()-b.getAge());
        lists.forEach(data-> System.out.println("删除排序后:"+data));

    }
}

参考

这个只是记录自己的感觉不错的编程技巧,会持续更新。

你可能感兴趣的:(#,开发中的小知识)