抽取所有CollStream中group相关函数,提取一个groupThen,采纳上一个PR回复的建议,使得代码更加灵活

This commit is contained in:
VampireAchao
2021-12-15 22:18:29 +08:00
parent 7e508a8d4e
commit 6c8ce4ea85
2 changed files with 119 additions and 54 deletions

View File

@@ -1,5 +1,6 @@
package cn.hutool.core.collection;
import cn.hutool.core.map.MapUtil;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;
@@ -7,6 +8,9 @@ import org.junit.Assert;
import org.junit.Test;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collector;
import java.util.stream.Collectors;
/**
* CollectionStream测试方法
@@ -168,6 +172,39 @@ public class CollStreamUtilTest {
Assert.assertEquals(compare, map);
}
@Test
public void testGroupThen() {
// groupThen作为之前所有group函数的公共部分抽取出来并更接近于jdk原生灵活性更强
// 参数null测试
Map<Long, List<Student>> map = CollStreamUtil.groupThen(null, Student::getTermId, Collectors.toList());
Assert.assertEquals(map, Collections.EMPTY_MAP);
// 参数空数组测试
List<Student> list = new ArrayList<>();
map = CollStreamUtil.groupThen(list, Student::getTermId, Collectors.toList());
Assert.assertEquals(map, Collections.EMPTY_MAP);
// 放入元素
list.add(new Student(1, 1, 1, "张三"));
list.add(new Student(1, 2, 1, "李四"));
list.add(new Student(2, 2, 1, "王五"));
// 先根据termId分组再通过classId比较找出最大值所属的那个Student,返回的Optional
Map<Long, Optional<Student>> longOptionalMap = CollStreamUtil.groupThen(list, Student::getTermId, Collectors.maxBy(Comparator.comparing(Student::getClassId)));
Assert.assertEquals("李四", longOptionalMap.get(1L).get().getName());
// 先根据termId分组再转换为Map<studentId,name>
Map<Long, HashMap<Long, String>> groupThen = CollStreamUtil.groupThen(list, Student::getTermId, Collector.of(HashMap::new, (m, v) -> m.put(v.getStudentId(), v.getName()), (l, r) -> l));
Assert.assertEquals(
MapUtil.builder()
.put(1L, MapUtil.builder().put(1L, "李四").build())
.put(2L, MapUtil.builder().put(1L, "王五").build())
.build(),
groupThen);
// 总之如果你是想要group分组后还要进行别的操作用它就对了
}
@Test
public void testTranslate2List() {