10个实现Java集合,Map类型自由转换的实用工具方法
整理了10个方法,可以满足 Collection、List、Set、Map 之间各种类型转化。例如
- 将
Collection<OrderItem>转化为List<OrderItem> - 将
Collection<OrderItem>转化为Set<OrderItem> - 将
List<OrderItem>转化为List<Long> - 将
Set<OrderItem>转化为Set<Long> - 将
Collection<OrderItem>转化为List<Long> - 将
Collection<OrderItem>转化为Set<Long> - 从
Collection<OrderItem>中提取 Key, Map 的 Value 就是类型 OrderItem - 从
Collection<OrderItem>中提取 Key, Map 的 Value 根据 OrderItem 类型进行转化。 - 将
Map<Long, OrderItem>中的value 转化为Map<Long, Double> - value 转化时,lamada表达式可以使用
(v)->{}, 也可以使用(k,v)->{ }。
集合类型转化
Collection 和 List、Set 的转化
- 将
Collection<OrderItem>转化为List<OrderItem> - 将
Collection<OrderItem>转化为Set<OrderItem>
public static <T> List<T> toList(Collection<T> collection) {
if (collection == null) {
return new ArrayList<>();
}
if (collection instanceof List) {
return (List<T>) collection;
}
return collection.stream().collect(Collectors.toList());
}
public static <T> Set<T> toSet(Collection<T> collection) {
if (collection == null) {
return new HashSet<>();
}
if (collection instanceof Set) {
return (Set<T>) collection;
}
return collection.stream().collect(Collectors.toSet());
}测试样例
@Test//将集合 Collection 转化为 List
public void testToList() {
Collection<OrderItem> collection = coll;
List<OrderItem> list = toList(coll);
}
@Test//将集合 Collection 转化为 Set
public void testToSet() {
Collection<OrderItem> collection = coll;
Set<OrderItem> set = toSet(collection);
}List和 Set 是 Collection 集合类型的子类,所以无需再转化。
List、Set 类型之间的转换
业务中有时候需要将 List<A> 转化为 List<B>。如何实现工具类呢?
public static <T, R> List<R> map(List<T> collection, Function<T, R> mapper) {
return collection.stream().map(mapper).collect(Collectors.toList());
}
public static <T, R> Set<R> map(Set<T> collection, Function<T, R> mapper) {
return collection.stream().map(mapper).collect(Collectors.toSet());
}
public static <T, R> List<R> mapToList(Collection<T> collection, Function<T, R> mapper) {
return collection.stream().map(mapper).collect(Collectors.toList());
}
public static <T, R> Set<R> mapToSet(Collection<T> collection, Function<T, R> mapper) {
return collection.stream().map(mapper).collect(Collectors.toSet());
}测试样例
- 将
List<OrderItem>转化为List<Long> - 将
Set<OrderItem>转化为Set<Long> - 将
Collection<OrderItem>转化为List<Long> - 将
Collection<OrderItem>转化为Set<Long>
@Test
public void testMapToList() {
Collection<OrderItem> collection = coll;
List<OrderItem> list = toList(coll);
List<Long> orderIdList = map(list, (item) -> item.getOrderId());
}
@Test
public void testMapToSet() {
Collection<OrderItem> collection = coll;
Set<OrderItem> set = toSet(coll);
Set<Long> orderIdSet = map(set, (item) -> item.getOrderId());
}
@Test
public void testMapToList2() {
Collection<OrderItem> collection = coll;
List<Long> orderIdList = mapToList(collection, (item) -> item.getOrderId());
}
@Test
public void testMapToSetV2() {
Collection<OrderItem> collection = coll;
Set<Long> orderIdSet = mapToSet(collection, (item) -> item.getOrderId());
}接下来看 Collection 集合类型到 Map类型的转化。
Collection 转化为 Map
由于 List 和 Set 是 Collection 类型的子类,所以只需要实现Collection 类型转化为 Map 类型即可。 Collection转化为 Map 共分两个方法
- 从
Collection<OrderItem>中提取 Key, Map 的 Value 就是类型 OrderItem - 从
Collection<OrderItem>中提取 Key, Map 的 Value 根据 OrderItem 类型进行转化。
public static <T, K> Map<K, T> toMap(Collection<T> collection, Function<? super T, ? extends K> keyMapper) {
return toMap(collection, keyMapper, Function.identity());
}
public static <T, K, V> Map<K, V> toMap(Collection<T> collection,
Function<? super T, ? extends K> keyFunction,
Function<? super T, ? extends V> valueFunction) {
return toMap(collection, keyFunction, valueFunction, pickLast());
}
public static <T, K, V> Map<K, V> toMap(Collection<T> collection,
Function<? super T, ? extends K> keyFunction,
Function<? super T, ? extends V> valueFunction,
BinaryOperator<V> mergeFunction) {
if (CollectionUtils.isEmpty(collection)) {
return new HashMap<>(0);
}
return collection.stream().collect(Collectors.toMap(keyFunction, valueFunction, mergeFunction));
}使用样例
@Test
public void testToMap() {
Collection<OrderItem> collection = coll;
Set<OrderItem> set = toSet(collection);
Map<Long, OrderItem> map = toMap(set, OrderItem::getOrderId);
}
@Test
public void testToMapV2() {
Collection<OrderItem> collection = coll;
Set<OrderItem> set = toSet(collection);
Map<Long, Double> map = toMap(set, OrderItem::getOrderId, OrderItem::getActPrice);
}代码示例中把Set<OrderItem> 转化为 Map<Long, OrderItem> 和 Map<Long ,Double>。
Map格式转换
转换 Map 的 Value
- 将 Map<Long, OrderItem> 中的value 转化为 Map<Long, Double>
- value 转化时,lamada表达式可以使用(v)->{}, 也可以使用 (k,v)->{ }。
public static <K, V, C> Map<K, C> convertMapValue(Map<K, V> map,
BiFunction<K, V, C> valueFunction,
BinaryOperator<C> mergeFunction) {
if (isEmpty(map)) {
return new HashMap<>();
}
return map.entrySet().stream().collect(Collectors.toMap(
e -> e.getKey(),
e -> valueFunction.apply(e.getKey(), e.getValue()),
mergeFunction
));
}
public static <K, V, C> Map<K, C> convertValue(Map<K, V> originMap, BiFunction<K, V, C> valueConverter) {
return convertValue(originMap, valueConverter, Lambdas.pickLast());
}
public static <T> BinaryOperator<T> pickFirst() {
return (k1, k2) -> k1;
}
public static <T> BinaryOperator<T> pickSecond() {
return (k1, k2) -> k2;
}测试样例
@Test
public void testConvertValue() {
Collection<OrderItem> collection = coll;
Set<OrderItem> set = toSet(collection);
Map<Long, OrderItem> map = toMap(set, OrderItem::getOrderId);
Map<Long, Double> orderId2Price = convertMapValue(map, item -> item.getActPrice());
Map<Long, String> orderId2Token = convertMapValue(map, (id, item) -> id + item.getName());
}总结
以上样例包含了如下的映射场景
- 将
Collection<OrderItem>转化为List<OrderItem> - 将
Collection<OrderItem>转化为Set<OrderItem> - 将
List<OrderItem>转化为List<Long> - 将
Set<OrderItem>转化为Set<Long> - 将
Collection<OrderItem>转化为List<Long> - 将
Collection<OrderItem>转化为Set<Long> - 从
Collection<OrderItem>中提取 Key, Map 的 Value 就是类型 OrderItem - 从
Collection<OrderItem>中提取 Key, Map 的 Value 根据 OrderItem 类型进行转化。 - 将
Map<Long, OrderItem>中的value 转化为Map<Long, Double> - value 转化时,lamada表达式可以使用
(v)->{}, 也可以使用(k,v)->{ }。
以上就是10个实现Java集合,Map类型自由转换的实用工具方法的详细内容,更多关于Java类型转换的资料请关注脚本之家其它相关文章!
相关文章
java微信公众号开发第一步 公众号接入和access_token管理
这篇文章主要为大家介绍了java微信公众号开发,主要内容包括公众号接入和access_token管理,感兴趣的小伙伴们可以参考一下2016-01-01
JAVA WSIMPORT生成WEBSERVICE客户端401认证过程图解
这篇文章主要介绍了JAVA WSIMPORT生成WEBSERVICE客户端401认证过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2020-10-10
mybatis返回list<Integer>时resultType写Integer问题
这篇文章主要介绍了mybatis返回list<Integer>时resultType写Integer问题,具有很好的参考价值,希望对大家有所帮助,2023-12-12
Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式
本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,感兴趣的朋友一起看看吧2025-07-07
SpringBoot利用限速器RateLimiter实现单机限流的示例代码
本文主要介绍了SpringBoot利用限速器RateLimiter实现单机限流的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2022-01-01
如何使用java agent修改字节码并在springboot启动时自动生效
本文介绍了JavaAgent的使用方法和在SpringBoot中的应用,JavaAgent可以通过修改类的字节码,实现对非Spring容器管理对象的AOP处理,演示了如何定义切面逻辑,实现接口mock,感兴趣的朋友跟随小编一起看看吧2024-10-10


最新评论