好说歪理绝非善变,能说会道过失必多——佚名
分享一个前两天写的lambda
操作树的BeanTree
https://gitee.com/dromara/hutool/pulls/884
代码地址:
使用方式如下:
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); } }