BeanTree

2022-11-30

java

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

分享一个前两天写的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;

/**
* 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);
}

}