!583 MapUtil提供change函数,EnumUtil提供getBy函数,通过lambda进行枚举字段映射

Merge pull request !583 from 阿超/v5-dev
This commit is contained in:
Looly
2022-03-24 15:55:54 +00:00
committed by Gitee
6 changed files with 195 additions and 20 deletions

View File

@@ -1,25 +1,39 @@
package cn.hutool.core.lang.func;
import lombok.Data;
import org.junit.Assert;
import org.junit.Test;
import lombok.Data;
public class LambdaUtilTest {
@Test
public void getMethodNameTest(){
public void getMethodNameTest() {
String methodName = LambdaUtil.getMethodName(MyTeacher::getAge);
Assert.assertEquals("getAge", methodName);
}
@Test
public void getFieldNameTest(){
public void getFieldNameTest() {
String fieldName = LambdaUtil.getFieldName(MyTeacher::getAge);
Assert.assertEquals("age", fieldName);
}
@Test
public void getImplClassTest() {
// 一般用于封装工具类时减少参数使用
Class<MyTeacher> aClass = LambdaUtil.getInstantiatedClass(MyTeacher::getAge);
Assert.assertEquals(MyTeacher.class, aClass);
// 一般用于封装工具类时减少参数使用
MyTeacher myTeacher = new MyTeacher();
Class<MyTeacher> bClass = LambdaUtil.getImplClass(myTeacher::getAge);
Assert.assertEquals(MyTeacher.class, bClass);
}
@Data
static class MyTeacher{
static class MyTeacher {
public String age;
}
}

View File

@@ -1,15 +1,44 @@
package cn.hutool.core.map;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.Opt;
import cn.hutool.core.util.StrUtil;
import lombok.Builder;
import lombok.Data;
import org.junit.Assert;
import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class MapUtilTest {
enum PeopleEnum {GIRL, BOY, CHILD}
@Data
@Builder
public static class User {
private Long id;
private String name;
}
@Data
@Builder
public static class Group {
private Long id;
private List<User> users;
}
@Data
@Builder
public static class UserGroup {
private Long userId;
private Long groupId;
}
@Test
public void filterTest() {
Map<String, String> map = MapUtil.newHashMap();
@@ -26,6 +55,47 @@ public class MapUtilTest {
Assert.assertEquals("4", map2.get("d"));
}
@Test
public void changeTest() {
// Add test like a foreigner
Map<Integer, String> adjectivesMap = MapUtil.<Integer, String>builder()
.put(0, "lovely")
.put(1, "friendly")
.put(2, "happily")
.build();
Map<Integer, String> resultMap = MapUtil.change(adjectivesMap, (k, v) -> v + " " + PeopleEnum.values()[k].name().toLowerCase());
Assert.assertEquals("lovely girl", resultMap.get(0));
Assert.assertEquals("friendly boy", resultMap.get(1));
Assert.assertEquals("happily child", resultMap.get(2));
// 下单用户Queue表示正在 .排队. 抢我抢不到的二次元周边!
Queue<String> customers = new ArrayDeque<>(Arrays.asList("刑部尚书手工耿", "木瓜大盗大漠叔", "竹鼠发烧找华农", "朴实无华朱一旦"));
// 分组
List<Group> groups = Stream.iterate(0L, i -> ++i).limit(4).map(i -> Group.builder().id(i).build()).collect(Collectors.toList());
// 如你所见它是一个mapkey由用户idvalue由用户组成
Map<Long, User> idUserMap = Stream.iterate(0L, i -> ++i).limit(4).map(i -> User.builder().id(i).name(customers.poll()).build()).collect(Collectors.toMap(User::getId, Function.identity()));
// 如你所见它是一个mapkey由分组idvalue由用户ids组成典型的多对多关系
Map<Long, List<Long>> groupIdUserIdsMap = groups.stream().flatMap(group -> idUserMap.keySet().stream().map(userId -> UserGroup.builder().groupId(group.getId()).userId(userId).build())).collect(Collectors.groupingBy(UserGroup::getUserId, Collectors.mapping(UserGroup::getGroupId, Collectors.toList())));
// 神奇的魔法发生了, 分组id和用户ids组成的map竟然变成了订单编号和用户实体集合组成的map
Map<Long, List<User>> groupIdUserMap = MapUtil.change(groupIdUserIdsMap, (groupId, userIds) -> userIds.stream().map(idUserMap::get).collect(Collectors.toList()));
// 然后你就可以拿着这个map去封装groups使其能够在订单数据带出客户信息啦
groups.forEach(group -> Opt.ofNullable(group.getId()).map(groupIdUserMap::get).ifPresent(group::setUsers));
// 下面是测试报告
groups.forEach(group -> {
List<User> users = group.getUsers();
Assert.assertEquals("刑部尚书手工耿", users.get(0).getName());
Assert.assertEquals("木瓜大盗大漠叔", users.get(1).getName());
Assert.assertEquals("竹鼠发烧找华农", users.get(2).getName());
Assert.assertEquals("朴实无华朱一旦", users.get(3).getName());
});
// 能写代码真开心
}
@Test
public void filterMapWrapperTest() {
Map<String, String> map = MapUtil.newHashMap();

View File

@@ -9,7 +9,7 @@ import java.util.Map;
/**
* EnumUtil单元测试
*
*
* @author looly
*
*/
@@ -20,39 +20,53 @@ public class EnumUtilTest {
List<String> names = EnumUtil.getNames(TestEnum.class);
Assert.assertEquals(CollUtil.newArrayList("TEST1", "TEST2", "TEST3"), names);
}
@Test
public void getFieldValuesTest() {
List<Object> types = EnumUtil.getFieldValues(TestEnum.class, "type");
Assert.assertEquals(CollUtil.newArrayList("type1", "type2", "type3"), types);
}
@Test
public void getFieldNamesTest() {
List<String> names = EnumUtil.getFieldNames(TestEnum.class);
Assert.assertTrue(names.contains("type"));
Assert.assertTrue(names.contains("name"));
}
@Test
public void getByTest() {
// 枚举中字段互相映射使用
TestEnum testEnum = EnumUtil.getBy(TestEnum::getType, "type2");
Assert.assertEquals("TEST2", testEnum.name());
}
@Test
public void getFieldByTest() {
// 枚举中字段互相映射使用
String type = EnumUtil.getFieldBy(TestEnum::getType, TestEnum::ordinal, 1);
Assert.assertEquals("type2", type);
}
@Test
public void likeValueOfTest() {
TestEnum value = EnumUtil.likeValueOf(TestEnum.class, "type2");
Assert.assertEquals(TestEnum.TEST2, value);
}
@Test
public void getEnumMapTest() {
Map<String,TestEnum> enumMap = EnumUtil.getEnumMap(TestEnum.class);
Assert.assertEquals(TestEnum.TEST1, enumMap.get("TEST1"));
}
@Test
public void getNameFieldMapTest() {
Map<String, Object> enumMap = EnumUtil.getNameFieldMap(TestEnum.class, "type");
assert enumMap != null;
Assert.assertEquals("type1", enumMap.get("TEST1"));
}
public enum TestEnum{
TEST1("type1"), TEST2("type2"), TEST3("type3");
@@ -62,11 +76,11 @@ public class EnumUtilTest {
private final String type;
private String name;
public String getType() {
return this.type;
}
public String getName() {
return this.name;
}