mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-07-21 15:09:48 +08:00
!884 【6.x】添加BeanTree,用于满足条件的Bean进行树转换与操作
Merge pull request !884 from 阿超/v6-dev
This commit is contained in:
@@ -2,19 +2,14 @@ package cn.hutool.core.stream;
|
||||
|
||||
import cn.hutool.core.collection.ListUtil;
|
||||
import cn.hutool.core.map.MapUtil;
|
||||
import cn.hutool.core.util.BooleanUtil;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Tolerate;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import static java.util.Arrays.asList;
|
||||
import static java.util.Collections.singletonList;
|
||||
|
||||
/**
|
||||
@@ -438,124 +433,4 @@ public class EasyStreamTest {
|
||||
Assert.assertTrue(EasyStream.of(1).isNotEmpty());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testToTree() {
|
||||
Consumer<Object> test = o -> {
|
||||
final List<Student> studentTree = EasyStream
|
||||
.of(
|
||||
Student.builder().id(1L).name("dromara").build(),
|
||||
Student.builder().id(2L).name("baomidou").build(),
|
||||
Student.builder().id(3L).name("hutool").parentId(1L).build(),
|
||||
Student.builder().id(4L).name("sa-token").parentId(1L).build(),
|
||||
Student.builder().id(5L).name("mybatis-plus").parentId(2L).build(),
|
||||
Student.builder().id(6L).name("looly").parentId(3L).build(),
|
||||
Student.builder().id(7L).name("click33").parentId(4L).build(),
|
||||
Student.builder().id(8L).name("jobob").parentId(5L).build()
|
||||
)
|
||||
// just 3 lambda,top parentId is null
|
||||
.toTree(Student::getId, Student::getParentId, Student::setChildren);
|
||||
Assert.assertEquals(asList(
|
||||
Student.builder().id(1L).name("dromara")
|
||||
.children(asList(Student.builder().id(3L).name("hutool").parentId(1L)
|
||||
.children(singletonList(Student.builder().id(6L).name("looly").parentId(3L).build()))
|
||||
.build(),
|
||||
Student.builder().id(4L).name("sa-token").parentId(1L)
|
||||
.children(singletonList(Student.builder().id(7L).name("click33").parentId(4L).build()))
|
||||
.build()))
|
||||
.build(),
|
||||
Student.builder().id(2L).name("baomidou")
|
||||
.children(singletonList(
|
||||
Student.builder().id(5L).name("mybatis-plus").parentId(2L)
|
||||
.children(singletonList(
|
||||
Student.builder().id(8L).name("jobob").parentId(5L).build()
|
||||
))
|
||||
.build()))
|
||||
.build()
|
||||
), studentTree);
|
||||
};
|
||||
test = test.andThen(o -> {
|
||||
final List<Student> studentTree = EasyStream
|
||||
.of(
|
||||
Student.builder().id(1L).name("dromara").matchParent(true).build(),
|
||||
Student.builder().id(2L).name("baomidou").matchParent(true).build(),
|
||||
Student.builder().id(3L).name("hutool").parentId(1L).build(),
|
||||
Student.builder().id(4L).name("sa-token").parentId(1L).build(),
|
||||
Student.builder().id(5L).name("mybatis-plus").parentId(2L).build(),
|
||||
Student.builder().id(6L).name("looly").parentId(3L).build(),
|
||||
Student.builder().id(7L).name("click33").parentId(4L).build(),
|
||||
Student.builder().id(8L).name("jobob").parentId(5L).build()
|
||||
)
|
||||
// just 4 lambda ,top by condition
|
||||
.toTree(Student::getId, Student::getParentId, Student::setChildren, s -> BooleanUtil.isTrue(s.getMatchParent()));
|
||||
Assert.assertEquals(asList(
|
||||
Student.builder().id(1L).name("dromara").matchParent(true)
|
||||
.children(asList(Student.builder().id(3L).name("hutool").parentId(1L)
|
||||
.children(singletonList(Student.builder().id(6L).name("looly").parentId(3L).build()))
|
||||
.build(),
|
||||
Student.builder().id(4L).name("sa-token").parentId(1L)
|
||||
.children(singletonList(Student.builder().id(7L).name("click33").parentId(4L).build()))
|
||||
.build()))
|
||||
.build(),
|
||||
Student.builder().id(2L).name("baomidou").matchParent(true)
|
||||
.children(singletonList(
|
||||
Student.builder().id(5L).name("mybatis-plus").parentId(2L)
|
||||
.children(singletonList(
|
||||
Student.builder().id(8L).name("jobob").parentId(5L).build()
|
||||
))
|
||||
.build()))
|
||||
.build()
|
||||
), studentTree);
|
||||
});
|
||||
test.accept(new Object());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFlatTree() {
|
||||
final List<Student> studentTree = asList(
|
||||
Student.builder().id(1L).name("dromara")
|
||||
.children(asList(Student.builder().id(3L).name("hutool").parentId(1L)
|
||||
.children(singletonList(Student.builder().id(6L).name("looly").parentId(3L).build()))
|
||||
.build(),
|
||||
Student.builder().id(4L).name("sa-token").parentId(1L)
|
||||
.children(singletonList(Student.builder().id(7L).name("click33").parentId(4L).build()))
|
||||
.build()))
|
||||
.build(),
|
||||
Student.builder().id(2L).name("baomidou")
|
||||
.children(singletonList(
|
||||
Student.builder().id(5L).name("mybatis-plus").parentId(2L)
|
||||
.children(singletonList(
|
||||
Student.builder().id(8L).name("jobob").parentId(5L).build()
|
||||
))
|
||||
.build()))
|
||||
.build()
|
||||
);
|
||||
Assert.assertEquals(asList(
|
||||
Student.builder().id(1L).name("dromara").build(),
|
||||
Student.builder().id(2L).name("baomidou").build(),
|
||||
Student.builder().id(3L).name("hutool").parentId(1L).build(),
|
||||
Student.builder().id(4L).name("sa-token").parentId(1L).build(),
|
||||
Student.builder().id(5L).name("mybatis-plus").parentId(2L).build(),
|
||||
Student.builder().id(6L).name("looly").parentId(3L).build(),
|
||||
Student.builder().id(7L).name("click33").parentId(4L).build(),
|
||||
Student.builder().id(8L).name("jobob").parentId(5L).build()
|
||||
), EasyStream.of(studentTree).flatTree(Student::getChildren, Student::setChildren).sorted(Comparator.comparingLong(Student::getId)).toList());
|
||||
|
||||
}
|
||||
|
||||
@Data
|
||||
@lombok.Builder
|
||||
public static class Student {
|
||||
private String name;
|
||||
private Integer age;
|
||||
private Long id;
|
||||
private Long parentId;
|
||||
private List<Student> children;
|
||||
private Boolean matchParent;
|
||||
|
||||
@Tolerate
|
||||
public Student() {
|
||||
// this is an accessible parameterless constructor.
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
129
hutool-core/src/test/java/cn/hutool/core/tree/BeanTreeTest.java
Normal file
129
hutool-core/src/test/java/cn/hutool/core/tree/BeanTreeTest.java
Normal file
@@ -0,0 +1,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);
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user