BeanTree

简介: BeanTree

好说歪理绝非善变,能说会道过失必多——佚名

分享一个前两天写的lambda操作树的BeanTree

https://gitee.com/dromara/hutool/pulls/884

代码地址:

https://gitee.com/dromara/hutool/blob/v6-dev/hutool-core/src/main/java/cn/hutool/core/tree/BeanTree.java

使用方式如下:

package cn.hutool.core.tree;
import cn.hutool.core.stream.EasyStream;
import lombok.Builder;
import lombok.Data;
import lombok.experimental.Tolerate;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.util.Comparator;
import java.util.List;
import static java.util.Arrays.asList;
import static java.util.Collections.singletonList;
/**
 * TreeHelperTest
 *
 * @author VampireAchao
 */
public class BeanTreeTest {
  @Data
  @Builder
  private static class JavaBean {
    @Tolerate
    public JavaBean() {
      // this is an accessible parameterless constructor.
    }
    private String name;
    private Integer age;
    private Long id;
    private Long parentId;
    private List<JavaBean> children;
    private Boolean matchParent;
  }
  List<JavaBean> originJavaBeanList;
  List<JavaBean> originJavaBeanTree;
  BeanTree<JavaBean, Long> beanTree;
  @Before
  public void setUp() {
    originJavaBeanList = EasyStream
        .of(
            JavaBean.builder().id(1L).name("dromara").matchParent(true).build(),
            JavaBean.builder().id(2L).name("baomidou").matchParent(true).build(),
            JavaBean.builder().id(3L).name("hutool").parentId(1L).build(),
            JavaBean.builder().id(4L).name("sa-token").parentId(1L).build(),
            JavaBean.builder().id(5L).name("mybatis-plus").parentId(2L).build(),
            JavaBean.builder().id(6L).name("looly").parentId(3L).build(),
            JavaBean.builder().id(7L).name("click33").parentId(4L).build(),
            JavaBean.builder().id(8L).name("jobob").parentId(5L).build()
        ).toList();
    originJavaBeanTree = asList(
        JavaBean.builder().id(1L).name("dromara").matchParent(true)
            .children(asList(
                JavaBean.builder().id(3L).name("hutool").parentId(1L)
                    .children(singletonList(JavaBean.builder().id(6L).name("looly").parentId(3L).build()))
                    .build(),
                JavaBean.builder().id(4L).name("sa-token").parentId(1L)
                    .children(singletonList(JavaBean.builder().id(7L).name("click33").parentId(4L).build()))
                    .build()))
            .build(),
        JavaBean.builder().id(2L).name("baomidou").matchParent(true)
            .children(singletonList(
                JavaBean.builder().id(5L).name("mybatis-plus").parentId(2L)
                    .children(singletonList(
                        JavaBean.builder().id(8L).name("jobob").parentId(5L).build()
                    ))
                    .build()))
            .build()
    );
    beanTree = BeanTree.of(JavaBean::getId, JavaBean::getParentId, null, JavaBean::getChildren, JavaBean::setChildren);
  }
  @Test
  public void testToTree() {
    final List<JavaBean> javaBeanTree = beanTree.toTree(originJavaBeanList);
    Assert.assertEquals(originJavaBeanTree, javaBeanTree);
    final BeanTree<JavaBean, Long> conditionBeanTree = BeanTree.ofMatch(JavaBean::getId, JavaBean::getParentId, s -> Boolean.TRUE.equals(s.getMatchParent()), JavaBean::getChildren, JavaBean::setChildren);
    Assert.assertEquals(originJavaBeanTree, conditionBeanTree.toTree(originJavaBeanList));
  }
  @Test
  public void testFlat() {
    final List<JavaBean> javaBeanList = beanTree.flat(originJavaBeanTree);
    javaBeanList.sort(Comparator.comparing(JavaBean::getId));
    Assert.assertEquals(originJavaBeanList, javaBeanList);
  }
  @Test
  public void testFilter() {
    final List<JavaBean> javaBeanTree = beanTree.filter(originJavaBeanTree, s -> "looly".equals(s.getName()));
    Assert.assertEquals(singletonList(
            JavaBean.builder().id(1L).name("dromara").matchParent(true)
                .children(singletonList(JavaBean.builder().id(3L).name("hutool").parentId(1L)
                    .children(singletonList(JavaBean.builder().id(6L).name("looly").parentId(3L).build()))
                    .build()))
                .build()),
        javaBeanTree);
  }
  @Test
  public void testForeach() {
    final List<JavaBean> javaBeanList = beanTree.forEach(originJavaBeanTree, s -> s.setName("【open source】" + s.getName()));
    Assert.assertEquals(asList(
        JavaBean.builder().id(1L).name("【open source】dromara").matchParent(true)
            .children(asList(JavaBean.builder().id(3L).name("【open source】hutool").parentId(1L)
                    .children(singletonList(JavaBean.builder().id(6L).name("【open source】looly").parentId(3L).build()))
                    .build(),
                JavaBean.builder().id(4L).name("【open source】sa-token").parentId(1L)
                    .children(singletonList(JavaBean.builder().id(7L).name("【open source】click33").parentId(4L).build()))
                    .build()))
            .build(),
        JavaBean.builder().id(2L).name("【open source】baomidou").matchParent(true)
            .children(singletonList(
                JavaBean.builder().id(5L).name("【open source】mybatis-plus").parentId(2L)
                    .children(singletonList(
                        JavaBean.builder().id(8L).name("【open source】jobob").parentId(5L).build()
                    ))
                    .build()))
            .build()
    ), javaBeanList);
  }
}
相关文章
基于RuoYi实现多条件分组排序列表
基于RuoYi实现多条件分组排序列表
基于RuoYi实现多条件分组排序列表
|
2月前
|
缓存 安全 网络协议
|
4月前
|
前端开发 JavaScript Java
【软件设计师备考 专题 】如何选择合适的程序设计语言
【软件设计师备考 专题 】如何选择合适的程序设计语言
173 0
|
9月前
|
开发工具 git Windows
【Windows】查看Git本地安装位置
【Windows】查看Git本地安装位置
|
运维 架构师 Devops
开发者、架构师、技术管理者DevOps技能学习篇
云效为开发者、架构师、项目管理者、技术管理者提供了系列学习资料和视频课程,帮助企业落地scrum、devops和bizdevops。
|
编解码 iOS开发 流计算
调用Live555接收RTSP直播流,转换为Http Live Streaming(iOS直播)协议
调用Live555接收RTSP直播流,转换为Http Live Streaming(iOS直播)协议
460 1
|
XML JSON 算法
spring常用注解(全)
Spring的一个核心功能是IOC,就是将Bean初始化加载到容器中,Bean是如何加载到容器的,可以使用Spring注解方式或者Spring XML配置方式。 Spring注解方式减少了配置文件内容,更加便于管理,并且使用注解可以大大提高了开发效率! 注解本身是没有功能的,和xml一样,注解和xml都是一种元数据,元数据即解释数据的数据,也就是所谓的配置。
345 0
|
前端开发
使用scroll-view实现一个滑动列表
使用scroll-view实现一个滑动列表
199 1
使用scroll-view实现一个滑动列表
|
消息中间件 运维 Java
从零学SpringCloud系列(九):利用kafka实现消息总线Spring Cloud Bus
从零学SpringCloud系列(九):利用kafka实现消息总线Spring Cloud Bus
254 0
从零学SpringCloud系列(九):利用kafka实现消息总线Spring Cloud Bus