前言
突然发现好久没写博客了,上次写还是在上次😄。开个玩笑,上一篇博客还是在11月29日,真亏我还记得命令。之前在公司是真心忙,之后疫情放开,公司还剩十几个人了,其他百来号人全居家/(ㄒoㄒ)/~~。然后领导直接申请放假,其实不太想放假的,毕竟一个月工资没了。
回家后呢忙白事,毕竟这个疫情,太多老人没挺过去,现在村里每天都能听到吹喇叭的,然后在外面冻了三天就开始发烧,也不知道是不是阳了,两天烧就退了,现在就只头晕了。
书归正题,之前公司前端需要调用Cascader级联选择器功能,我这边要给他出一个递归接口。突然想到之前看的jdk8新特性中的peek,发现这个方法完美契合递归,就尝试用peek写了一个树形结构。哎嗨真不错,简单又高效。下面具体讲一下这个功能。
peek
java 8 stream作为流式操作有两种操作类型,中间操作和终止操作。而peek就属于中间操作。咱们来看下面的例子
1 | Stream<String> stream = Stream.of("我", "是", "谁"); |
这段代码本意是输出stream中的值,实际并没有任何输出。
中间操作是对数据的加工,注意,中间操作是lazy操作,并不会立马启动,需要等待终止操作才会执行。终止操作是stream的启动操作,只有加上终止操作,stream才会真正的开始执行。所以,peek是一个中间操作,所以上面的例子没有任何输出。
1 | Stream<String> stream = Stream.of("我", "是", "谁"); |
.collect(Collectors.toList()) 就是一个最终操作,可以正常输出结果。之后的事情就好办了(具体peek方法的使用还需要各位自己查询资料,这里不做过多赘述)。
递归
前提条件
需要jkd8及以上版本
实体类
1 | import lombok.Data; |
调用
1 | List<StaffFolder> staffFolders = staffFolderMapper.selectStaffFolderList(staffFolder); |
因一开始查询出的是StaffFolder数组,需要将其对应的字段参数赋值到TreeDto数组中,通过实体类中的构造函数进行赋值。
filter()筛选其中父类id为0的数据作为一级目录。然后在peek中进行子类赋值,因为peek作为中间操作,只有进行最终操作后才会输出,这就完美契合了递归的功能。
被调用
1 | private static List<TreeDto> getChildrens(TreeDto treeDto,List<TreeDto> TreeDtos){ |
这里同理,将一级目录与数据传入,当父级id与id相同时,进行peek,之后循环调用自己return最终结果。
最终结果
1 | { |
有时候前端希望"childList": []
没有子级是返回null,当返回空数组时,前端会出现可以点击下级,而下级没有数据的情况。当然这个要看前端用的什么组件了。
我这举个简单的例子,扩展一下思路,各位有更好的方法就当我没说
1 | private static List<TreeDto> getChildrens(TreeDto treeDto,List<TreeDto> TreeDtos){ |
通过简单的三目运算符,当返回值为空数组时,将null赋值。
完!下篇应该是写关于在咸鱼买卖东西赚了90元钱的事情,挺有意思,和我看的一本书《优势谈判》里面的内容高度吻合,简单记录一下,尽情期待(^_^)。