使用BiFunction更改map的value

简介: 使用BiFunction更改map的value

伟大变为可笑只有一步,但再走一步,可笑又会变为伟大。——佩思

这个PR是这样的:

map 通过传入的BiFunction实现来返回值为新的map,支持返回别的类型

/**
 * 通过biFunction自定义一个规则,此规则将原Map中的元素转换成新的元素,生成新的Map返回<br>
 * 变更过程通过传入的 {@link BiFunction} 实现来返回一个值可以为不同类型的 {@link Map}
 *
 * @param map        原有的map
 * @param biFunction {@code lambda},参数包含{@code key},{@code value},返回值会作为新的{@code value}
 * @param <K>        {@code key}的类型
 * @param <V>        {@code value}的类型
 * @param <R>        新的,修改后的{@code value}的类型
 * @return 值可以为不同类型的 {@link Map}
 * @since 5.8.0
 */
public static <K, V, R> Map<K, R> map(Map<K, V> map, BiFunction<K, V, R> biFunction) {
  if (null == map || null == biFunction) {
    return MapUtil.newHashMap();
  }
  return map.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, m -> biFunction.apply(m.getKey(), m.getValue())));
}

定义个小枚举

enum PeopleEnum {GIRL, BOY, CHILD}

开始操作

Map<Integer, String> adjectivesMap = MapUtil.<Integer, String>builder()
.put(0, "lovely")
.put(1, "friendly")
.put(2, "happily")
.build();
Map<Integer, String> resultMap = MapUtil.map(adjectivesMap, (k, v) -> v + " " + PeopleEnum.values()[k].name().toLowerCase());

结果为

{
  0: "lovely girl",
  1: "friendly boy",
  2: "happily 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;
}

操作:

// 下单用户,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());
// 如你所见,它是一个map,key由用户id,value由用户组成
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()));
// 如你所见,它是一个map,key由分组id,value由用户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.map(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());
});
相关文章
|
1月前
|
存储 Java API
Java交换map的key和value值
通过本文介绍的几种方法,可以在Java中实现Map键值对的交换。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。对于简单的键值对交换,可以使用简单遍历法或Java 8的Stream API;对于需要处理值不唯一的情况,可以使用集合存储或Guava的Multimap。希望本文对您理解和实现Java中的Map键值对交换有所帮助。
33 1
|
6月前
|
存储 Java API
探讨Java中交换Map的Key和Value值的技术
探讨Java中交换Map的Key和Value值的技术
50 2
|
6月前
|
存储 缓存 Java
Java交换map的key和value值
在Java中,直接交换`Map`的key和value是不允许的,因为key是唯一的且不可变。不过,可以通过创建新`Map`实现交换:将原`Map`的value作为新key,key作为新value。注意,如果原`Map`有重复value或null,需额外处理。以下是一个代码示例,展示了如何在value唯一且非null的情况下交换`Map`的key和value。对于重复value或null值的情况,可以使用`List`存储多个key或忽略null值。在实际应用中,`Map`常用于缓存、配置管理、数据库结果映射等多种场景。
74 1
|
7月前
|
运维 API 开发工具
对象存储oss使用问题之获取临时访问凭证报错:It is not a map value.如何解决
《对象存储OSS操作报错合集》精选了用户在使用阿里云对象存储服务(OSS)过程中出现的各种常见及疑难报错情况,包括但不限于权限问题、上传下载异常、Bucket配置错误、网络连接问题、跨域资源共享(CORS)设定错误、数据一致性问题以及API调用失败等场景。为用户降低故障排查时间,确保OSS服务的稳定运行与高效利用。
517 0
|
7月前
|
Java API
List转Map(id为key,list为value)
List转Map(id为key,list为value)
271 0
|
存储 自然语言处理 数据可视化
按Value对Map进行排序,技术大佬们都在用这个方法
在Java中,Map的排序一般会根据Key或者Value来进行。按照Value对Map进行排序,通常会用在以下几种场景。
|
Java 数据格式 Spring
SpringBoot中@Value注解注入List或Map数据格式出现异常
在做一个小demo的时候、做的例子是我想在程序运行时将一些数据放入到配置类中的属性中、我想到可以通过yaml配置的数据映射到实体类中的属性中、我在想通过这种形式能不能映射。
java中Map根据key排序,根据value排序
HashMap根据key或value排序(stream流操作)
|
缓存 JSON NoSQL
Map<Integer,Value>放入缓存后取出来变成了Map<String,Value>
Map<Integer,Value>放入缓存后取出来变成了Map<String,Value>
220 0
|
存储 Scala
Scala的map实现key和value排序及各种排序比较等知识讨论
Scala的map实现key和value排序及各种排序比较等知识讨论
257 0
Scala的map实现key和value排序及各种排序比较等知识讨论