好说歪理绝非善变,能说会道过失必多——佚名
分享一个前两天写的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
使用方式如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
| 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;
public class BeanTreeTest {
@Data @Builder private static class JavaBean { @Tolerate public JavaBean() { }
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); }
}
|